java poi生成的word表格在wps中的显示问题
- 问题描述:
- poi导出的word文档使用office打开效果正常:
- poi导出的word文档使用wps打开效果异常:
- 问题分析:
- 1.怀疑是合并单元格问题
- 2.继续对比document.xml查找蛛丝马迹
- 最终解决办法:
- 1.首先poi创建完表格后,设置表格宽度类型为PCT,设置默认宽度为4940
- 2.根据列数,设置每列宽度
问题描述:
poi导出的word文档使用office打开效果正常:
poi导出的word文档使用wps打开效果异常:
问题分析:
1.怀疑是合并单元格问题
在桌面手动创建office文件,添加以上表格,保存后使用wps打开,发现格式与office一致,没有什么异常。怀疑是程序使用了过时的api,wps不支持某些word标签,分析过程如下:
1.1 将刚才手动创建的.docx的word文件扩展名改为.zip,用压缩软件打开zip文件,找到document.xml。
1.2 打开document.xml文件
1.3 同样的步骤,把我自己通过poi生成的word文档改成zip文件,打开document.xml
1.4 对比看一下两个xml文件,发现了很多区别,合并单元格确实是使用了不同的标签,poi我是使用hMerge做的合并单元格,而手动创建的office word文档使用的时gridSpan
poi合并单元格代码是在网上抄的,如下:
public static void mergeHorizontal(XWPFTable table, int row, int startCell, int endCell) {
for (int i = startCell; i <= endCell; i++) {
XWPFTableCell cell = table.getRow(row).getCell(i);
if (i == startCell) {
// The first merged cell is set with RESTART merge value
cell.getCTTc().addNewTcPr().addNewHMerge().setVal(STMerge.RESTART);
} else {
// Cells which join (merge) the first one, are set with CONTINUE
cell.getCTTc().addNewTcPr().addNewHMerge().setVal(STMerge.CONTINUE);
}
}
}
1.5 尝试使用 cell.getCTTc().getTcPr().getGridSpan().setVal(“合并列数”) 替换了HMerger,并删除多余列。最终效果和之前一样,office打开正常,wps打开还是老样子,白折腾一圈,看来不是这个问题。
2.继续对比document.xml查找蛛丝马迹
2.1 发现手动创建的office word的表格宽度都是按固定值设置的,而且设置了每列宽度,我使用poi设置的表格宽度是百分比,且没有具体的设置每列宽度。
2.2 在poi中加入设置每列宽度,按固定值设置表格宽度之后,解决了问题。
最终解决办法:
1.首先poi创建完表格后,设置表格宽度类型为PCT,设置默认宽度为4940
2.根据列数,设置每列宽度