POI 操作 word 中的表格,復制一行的正確做法


需求很簡單,在 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());
        }
    }
}

 網上找的例子實在坑死人。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM