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