Apache POI XWPFTable多行多列垂直合并异常问题求助
Apache POI XWPFTable 多行多列垂直合并异常解决方案
问题场景
使用Apache POI的XWPFTable进行单元格垂直合并时,同一行存在多组垂直合并操作会出现异常:例如合并row(0).getCell(0)与row(1).getCell(0)、row(0).getCell(1)与row(1).getCell(1)时,仅最后一组合并生效;仅执行单一合并操作时则正常。
问题原因
原合并方法中,每次调用addNewTcPr()都会直接创建新的TcPr元素,覆盖单元格原本已有的TcPr配置。若单元格默认带有TcPr(如样式、对齐属性),或同一行多组合并时,前序单元格的合并配置会因TcPr被覆盖而丢失,最终仅最后一组合并的设置被保留。
修复方案
修改合并方法,优先获取单元格已有的TcPr,仅在不存在时才新建;针对VMerge属性,同样优先复用已有配置,避免覆盖原有设置:
private void mergeCellsV(XWPFTableCell cellStart, XWPFTableCell cellFinish) { // 处理起始单元格:设置为RESTART CTTcPr tcPrStart = cellStart.getCTTc().getTcPr(); if (tcPrStart == null) { tcPrStart = cellStart.getCTTc().addNewTcPr(); } CTVMerge vMergeStart = tcPrStart.getVMerge(); if (vMergeStart == null) { vMergeStart = tcPrStart.addNewVMerge(); } vMergeStart.setVal(STMerge.RESTART); // 处理结束单元格:设置为CONTINUE CTTcPr tcPrFinish = cellFinish.getCTTc().getTcPr(); if (tcPrFinish == null) { tcPrFinish = cellFinish.getCTTc().addNewTcPr(); } CTVMerge vMergeFinish = tcPrFinish.getVMerge(); if (vMergeFinish == null) { vMergeFinish = tcPrFinish.addNewVMerge(); } vMergeFinish.setVal(STMerge.CONTINUE); }
验证效果
使用修改后的方法执行所有合并操作:
XWPFTableRow row0 = tablePK.getRow(0); XWPFTableRow row1 = tablePK.getRow(1); XWPFTableRow row2 = tablePK.getRow(2); XWPFTableRow row3 = tablePK.getRow(3); mergeCellsV(row0.getCell(0), row1.getCell(0)); mergeCellsV(row0.getCell(1), row1.getCell(1)); mergeCellsV(row0.getCell(5), row1.getCell(5)); mergeCellsV(row0.getCell(6), row1.getCell(6)); mergeCellsV(row2.getCell(0), row3.getCell(0)); mergeCellsV(row2.getCell(1), row3.getCell(1)); mergeCellsV(row2.getCell(5), row3.getCell(5)); mergeCellsV(row2.getCell(6), row3.getCell(6));
所有垂直合并操作均可正常生效,不会出现仅最后一组生效的异常。
内容的提问来源于stack exchange,提问作者Milos Jelic
相关产品推荐
相关产品推荐

