博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
  159 随笔 :: 3 文章 :: 67 评论 :: 35万 阅读
< 2025年1月 >
29 30 31 1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31 1
2 3 4 5 6 7 8

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

 网上找的例子实在坑死人。

 

posted on   黑米  阅读(4038)  评论(0编辑  收藏  举报
编辑推荐:
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
· 现代计算机视觉入门之:什么是图片特征编码
· .NET 9 new features-C#13新的锁类型和语义
阅读排行:
· 《HelloGitHub》第 106 期
· Spring AI + Ollama 实现 deepseek-r1 的API服务和调用
· 数据库服务器 SQL Server 版本升级公告
· 深入理解Mybatis分库分表执行原理
· 使用 Dify + LLM 构建精确任务处理应用
点击右上角即可分享
微信分享提示