需求很簡單,在 word 表格中有一個模板行,在它下面插入 N 行數據,插入的數據行,樣式和格式要和模板行一樣。
通過
XmlObject copy = defRow.getCtRow().copy();
table.addRow(new XWPFTableRow((CTRow) copy), table);
這種方式,盡管可以插入新的行,可數據寫不進單元格。其原因是 copy() 不是深拷貝,其內容依然依賴原行。
只能自己手工創建行,並且指定樣式和原樣式一樣。
XWPFTableRow newRow = table.insertNewTableRow(++dataRowIndex); createCellsAndCopyStyles(newRow, defRow); private static void createCellsAndCopyStyles(XWPFTableRow targetRow, XWPFTableRow sourceRow) { targetRow.getCtRow().setTrPr(sourceRow.getCtRow().getTrPr()); List<XWPFTableCell> tableCells = sourceRow.getTableCells(); if (CollectionUtils.isEmpty(tableCells)) { return; } for (XWPFTableCell sourceCell : tableCells) { XWPFTableCell newCell = targetRow.addNewTableCell(); newCell.getCTTc().setTcPr(sourceCell.getCTTc().getTcPr()); List<XWPFParagraph> sourceParagraphs = sourceCell.getParagraphs(); if (CollectionUtils.isEmpty(sourceParagraphs)) { continue; } XWPFParagraph sourceParagraph = sourceParagraphs.get(0); List<XWPFParagraph> targetParagraphs = newCell.getParagraphs(); if (CollectionUtils.isEmpty(targetParagraphs)) { XWPFParagraph p = newCell.addParagraph(); p.getCTP().setPPr(sourceParagraph.getCTP().getPPr()); XWPFRun run = p.getRuns().isEmpty() ? p.createRun() : p.getRuns().get(0); run.setFontFamily(sourceParagraph.getRuns().get(0).getFontFamily()); } else { XWPFParagraph p = targetParagraphs.get(0); p.getCTP().setPPr(sourceParagraph.getCTP().getPPr()); XWPFRun run = p.getRuns().isEmpty() ? p.createRun() : p.getRuns().get(0); run.setFontFamily(sourceParagraph.getRuns().get(0).getFontFamily()); } } }
網上找的例子實在坑死人。