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

本文详细记录了使用Apache POI库生成的Word文档在WPS中显示异常的问题,经过分析发现是表格宽度和列宽设置导致的。通过设置表格宽度类型为PCT,并为每列指定固定宽度,成功解决了兼容性问题。这为处理类似问题提供了参考。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

office效果

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

wps效果

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

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

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

1.2 打开document.xml文件
手动创建office文档的document.xml

1.3 同样的步骤,把我自己通过poi生成的word文档改成zip文件,打开document.xml
poi生成的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.2 在poi中加入设置每列宽度,按固定值设置表格宽度之后,解决了问题。

最终解决办法:
1.首先poi创建完表格后,设置表格宽度类型为PCT,设置默认宽度为4940

设置表格宽度

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

设置列宽

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

打不死的小闫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值