2000字范文,分享全网优秀范文,学习好帮手!
2000字范文 > POI导出word表格 office打开没问题 wps打开列有问题

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

时间:2023-12-24 12:01:31

相关推荐

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

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

模板样式导出文档office打开wps打开文件1.给表格设置宽,指定宽度2.将布局固定3.动态设置单元格的宽度4.重点设置CTTblGrid的宽度!!!

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

模板样式

导出文档office打开

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()));}}

注意事项

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

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

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

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

打开解压后的文件D:\Test\1\word, 找到document.xml;

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

由于模板中表格就是两列,所以需要单独设置tblGrid前两列的宽度。

//获取到table的CTTblGrid CTTblGrid tblGrid = table.getCTTbl().getTblGrid();//获取有多少单元格数量CTTblGridCol[] grid = tblGrid.getGridColArray();//单元格数量大于1if (grid.length >= 1) {tblGrid.getGridColArray(0).setW(BigInteger.valueOf(1701));//resultList.size()是生成列的数量tblGrid.getGridColArray(1).setW(BigInteger.valueOf(8505 / resultList.size()));}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。