需求很简单,在 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()); } } } |
网上找的例子实在坑死人。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 深入理解 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 构建精确任务处理应用