java poi生成的word表格在wps中的显示问题

  • 问题描述:
  • poi导出的word文档使用office打开效果正常:
  • poi导出的word文档使用wps打开效果异常:
  • 问题分析:
  • 1.怀疑是合并单元格问题
  • 2.继续对比document.xml查找蛛丝马迹
  • 最终解决办法:
  • 1.首先poi创建完表格后,设置表格宽度类型为PCT,设置默认宽度为4940
  • 2.根据列数,设置每列宽度


问题描述:

poi导出的word文档使用office打开效果正常:

java poi操纵word java poi wps_合并单元格

poi导出的word文档使用wps打开效果异常:

java poi操纵word java poi wps_idea_02

问题分析:

1.怀疑是合并单元格问题

在桌面手动创建office文件,添加以上表格,保存后使用wps打开,发现格式与office一致,没有什么异常。怀疑是程序使用了过时的api,wps不支持某些word标签,分析过程如下:

1.1 将刚才手动创建的.docx的word文件扩展名改为.zip,用压缩软件打开zip文件,找到document.xml。

java poi操纵word java poi wps_java_03

1.2 打开document.xml文件

java poi操纵word java poi wps_合并单元格_04

1.3 同样的步骤,把我自己通过poi生成的word文档改成zip文件,打开document.xml

java poi操纵word java poi wps_java_05

1.4 对比看一下两个xml文件,发现了很多区别,合并单元格确实是使用了不同的标签,poi我是使用hMerge做的合并单元格,而手动创建的office word文档使用的时gridSpan

java poi操纵word java poi wps_idea_06

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设置的表格宽度是百分比,且没有具体的设置每列宽度。

java poi操纵word java poi wps_合并单元格_07


2.2 在poi中加入设置每列宽度,按固定值设置表格宽度之后,解决了问题。

最终解决办法:

1.首先poi创建完表格后,设置表格宽度类型为PCT,设置默认宽度为4940

java poi操纵word java poi wps_idea_08

2.根据列数,设置每列宽度

java poi操纵word java poi wps_poi_09