需求很簡單,在 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());
}
}
}
網上找的例子實在坑死人。
