Apache POI循环复制XWPFTableRow时如何避免行数据重复
问题根因
代码中copiedRow对象的创建逻辑放在了循环外部,整个遍历过程中始终在修改同一个XWPFTableRow实例,调用addRow添加到表格时传入的都是同一个对象的引用,最终所有新增行都会展示最后一次循环给对象赋的值,因此出现全量数据重复的问题。
修复代码
将行复制的逻辑移动到循环内部,每次遍历都基于模板行生成独立的新行实例,赋值后再添加到表格即可:
XWPFTable TableArr1 = document.getTableArray(1); // 仅获取模板行,不提前复制生成待插入的行对象 XWPFTableRow templateRow = TableArr1.getRow(0); for (AuditEngagementLHA l : ListDivAndDivHead) { // 每次循环都复制出独立的新行实例,和其他行互不影响 XWPFTableRow copiedRow = new XWPFTableRow((CTRow) templateRow.getCtRow().copy(), TableArr1); copiedRow.getCell(2).setText(l.getDivisionName().trim()); copiedRow.getCell(3).setText(l.getNameDisplay().trim()); TableArr1.addRow(copiedRow); }
补充说明
- 循环内复制行的方式不会丢失模板行预设的样式、固定列内容,和预期展示效果完全匹配
- 原代码中声明的
indexCounter变量无实际调用逻辑,属于冗余代码,可直接删除 - 若需要指定新增行的插入位置,可以调用
addRow(XWPFTableRow row, int pos)重载方法,传入目标位置索引即可
内容的提问来源于stack exchange,提问作者Agung Donga
相关产品推荐
相关产品推荐

