poi-tl word表格(保留样式与合并单元格)

官网:Poi-tl Documentation

如何生成word文档官网有描述,这里主要讨论表格样式和合并单元格的问题。

样式

这段是官网在表格中插入行的代码,但是这样并不能保留表格的样式;

        // 插入行
        XWPFTableRow insertNewTableRow = table.insertNewTableRow(laborsStartRow);
        for (int j = 0; j < 7; j++) insertNewTableRow.createCell();
        // 单行渲染
        TableRenderPolicy.Helper.renderRow(table.getRow(laborsStartRow), labors.get(i));

我们可以复制word模板中的其中一行的样式。

        //样式
        XWPFTableRow tableRow = table.getRow(start);
        CTRow ctrow = CTRow.Factory.parse(tableRow.getCtRow().newInputStream());
        //根据模板行生成带样式的一行
        XWPFTableRow addRow = new XWPFTableRow(ctrow, table);
        //将数据渲染到这一行(如果模板行没有字会报错)
        String[] fields = list.get(i).getRow();
        for (int k = 0; k < fields.length; k++) {
            XWPFTableCell cell = addRow.getTableCells().get(k);
            cell.getParagraphs().get(0).getRuns().get(0).setText(fields[k], 0);
        }
        //插入表格
        table.addRow(addRow, start + i);
合并单元格

官网中合并单元格的方法我试了没有作用,这里提供两种方式。

第一种word和wps都能正常显示,水平合并是HMerge,竖直合并是VMerge

        //合并第0列
        if (k == 0) {
            if (i == 0)    //是否为合并开始行
            {
                CTVMerge ctvMerge = CTVMerge.Factory.newInstance();
                ctvMerge.setVal(STMerge.RESTART);
                cell.getCTTc().getTcPr().setVMerge(ctvMerge);
            } else {
                CTVMerge ctvMerge = CTVMerge.Factory.newInstance();
                ctvMerge.setVal(STMerge.CONTINUE);
                cell.getCTTc().getTcPr().setVMerge(ctvMerge);
            }
        }

第二种word显示会有问题,wps正常

            //合并第0列
            if (k == 0) {
                    /*if (i == 0)    //这段加上word会没有合并效果,wps显示正常
                        cell.getCTTc().addNewTcPr().addNewVMerge().setVal(STMerge.RESTART);
                    else */
                cell.getCTTc().addNewTcPr().addNewVMerge().setVal(STMerge.CONTINUE);
            }

参考文档:

POI给word中的表格table动态添加行,并保留上一行的样式_poi tables.create-CSDN博客

poi word操作之XWPFTable合并单元格_xwpftablecell-CSDN博客

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值