You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 07:12:13