Poi 纵向合并word中的相同数据的单元格


    /**
     * 合并单元格
     *
     * @param table         表格对象
     * @param beginRowIndex 开始行索引
     * @param endRowIndex   结束行索引
     * @param colIndex      合并列索引
     */
    public static void mergeCell(XWPFTable table, int beginRowIndex, int endRowIndex, int colIndex) {
        if (beginRowIndex == endRowIndex || beginRowIndex > endRowIndex) {
            return;
        }
        //合并行单元格的第一个单元格
        CTVMerge startMerge = CTVMerge.Factory.newInstance();
        startMerge.setVal(STMerge.RESTART);
        //合并行单元格的第一个单元格之后的单元格
        CTVMerge endMerge = CTVMerge.Factory.newInstance();
        endMerge.setVal(STMerge.CONTINUE);
        table.getRow(beginRowIndex).getCell(colIndex).getCTTc().getTcPr().setVMerge(startMerge);
        for (int i = beginRowIndex + 1; i <= endRowIndex; i++) {
            table.getRow(i).getCell(colIndex).getCTTc().getTcPr().setVMerge(endMerge);
        }

        上述代码在合并单元格时,其实是有问题的。举个例子,如果你先调用此方法合并了第一行与第二行,此时如果再次调用此方法合并了第二行与第三行,那么最终呈现出来的是只合并了第二行与第三行,简而言之就是涉及同一行时,多次合并会覆盖合并效果。所以需要你提前计算出要合并的行坐标,根据相同数据的坐标组,再循环调用此方法,这样就不会产生覆盖问题。
详情参考:获取list中相邻且相等的元素下标组(开始下标与结束下标)-CSDN博客

        所以具体做法是:

解析这个word文档,获取XWPFDocument 对象 doc

---->获取doc中所有XWPFtable  tableList(word中所有的涉及表格的信息)

--->循环tableList

--->获取table中text,找出需要合并的表格(这一步text是指word中表格的表头等信息)

--->根据列数循环

--->根据列坐标找出每一行数据text的List

---->获取list中相邻且相等的元素下标组(开始下标与结束下标)

--->调用合并单元格方法。

  • 7
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值