POI导出word表格 office打开没问题 wps打开列有问题


使用POI导出文档,文档中有表格,且表格的列是动态添加。生成的文档,使用office打开没问题,但是使用wps打开,表格生成的列被挤压。

模板样式

动态添加列和行

导出文档office打开

office打开文件

wps打开文件

wps打开

1.给表格设置宽,指定宽度

        table.getCTTbl().getTblPr().getTblW().setType(STTblWidth.DXA);
        table.getCTTbl().getTblPr().getTblW().setW(new BigInteger("10206"));

2.将布局固定

        CTTblPr tblPr = table.getCTTbl().getTblPr() == null ? table.getCTTbl().addNewTblPr() : table.getCTTbl().getTblPr();
        CTTblLayoutType t = tblPr.isSetTblLayout() ? tblPr.getTblLayout() : tblPr.addNewTblLayout();
        t.setType(STTblLayoutType.FIXED);//使布局固定,不随内容改变宽度

3.动态设置单元格的宽度

 //获取表格第一行
 XWPFTableRow rowM = table.getRow(0);
 //循环第一行中的每一列设置每列的宽度
 for (int num = 0; num < rowM.getTableCells().size(); num++) {
            XWPFTableCell sourceTableCell = rowM.getTableCells().get(num);
            CTTcPr ctTcPr = sourceTableCell.getCTTc().isSetTcPr() ? sourceTableCell.getCTTc().getTcPr() : sourceTableCell.getCTTc().addNewTcPr();
            CTTblWidth ctTblWidth = ctTcPr.getTcW();
            ctTblWidth.setType(STTblWidth.DXA);
            if (num == 0) {
            //第一个单元格固定宽度
                ctTblWidth.setW(BigInteger.valueOf(1701));
            } else {
            //后面的单元格根据数量平均分配
                ctTblWidth.setW(BigInteger.valueOf(8505 / resultList.size()));
            }
        }

注意事项

  1. 设置单元格和列表宽度时单位为:Twip中文译为"缇";
  2. 一公分则相当于567 Twips
  3. 上面1701相当于三公分

4.重点设置CTTblGrid的宽度!!!

以上设置完成后,在office打开是没问题的,但是wps打开出现问题,找了很多资料都没说出迷蒙蒙却的问题所在。在比对文件内部xml发现问题所在:

  1. 将生成的文件docx的后缀名改为zip,用压缩把将文件解压;
    文档改zip后缀解压

  2. 打开解压后的文件D:\Test\1\word, 找到document.xml;
    解压文件构成
    3.将文件document.xml打开,比对里面单元格的宽度,找到问题所在。设置的table的宽度为10206,type为dxa,布局方式也是fixed,这些都没问题,包括下边行中单元和的宽度1701、2835、2835…这个宽度也没问题,单单问题是出现在了tblGrid在这四个单元格的宽度就不是设置的宽度,第二个单元格的宽度变为7984,这就导致后面单元格的宽度被压缩,所以要解决此问题,需要手动 设置tblGrid的宽度。
    xml结构
    由于模板中表格就是两列,所以需要单独设置tblGrid前两列的宽度。

       //获取到table的CTTblGrid 
        CTTblGrid tblGrid = table.getCTTbl().getTblGrid();
        //获取有多少单元格数量
        CTTblGridCol[] grid = tblGrid.getGridColArray();
        //单元格数量大于1
        if (grid.length >= 1) {
            tblGrid.getGridColArray(0).setW(BigInteger.valueOf(1701));
            //resultList.size()是生成列的数量
            tblGrid.getGridColArray(1).setW(BigInteger.valueOf(8505 / resultList.size()));
        }
    
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值