Apache POI 4.1.2生成xls在TomEE容器中打开报格式与扩展名不匹配错误
问题原因
- 核心原因是类加载冲突:TomEE Plus 1.7.5内置了低版本的Apache POI组件,默认类加载优先级高于应用自身引入的POI 4.1.2版本,新旧版本POI类混用导致
HSSFWorkbook写出的文件结构不完整、不符合xls格式规范,Excel识别时就会提示格式与扩展名不匹配。 - TomEE 1.7.5内置的POI版本远低于4.1.2,核心API实现逻辑存在差异,未按照标准OLE2二进制结构生成xls文件,也会触发该错误。
- 测试环境无内置POI依赖,会完全加载应用打包的POI 4.1.2版本,因此运行正常。
修复方案
方案1:配置应用优先加载自身POI依赖(推荐)
在应用的WEB-INF目录下新增openejb-jar.xml配置文件,强制TomEE优先加载应用内的POI相关类,不使用容器内置的旧版本,配置内容如下:
<?xml version="1.0" encoding="UTF-8"?> <openejb-jar xmlns="http://www.openejb.org/openejb-jar/1.1"> <properties> openejb.classloader.for-load = org.apache.poi.** </properties> </openejb-jar>
该方案无需修改容器配置,仅影响当前应用的类加载逻辑,对其他应用无副作用。
方案2:移除容器内置的POI组件
如果有权限调整TomEE容器配置,可直接删除TomEE安装路径下lib/目录中所有poi-开头的Jar包,重启容器后就不会出现新旧版本冲突的问题。
方案3:降级POI版本适配容器(不推荐)
如果无法修改容器和应用配置,可将应用依赖的POI版本降级到和TomEE 1.7.5内置版本一致,保证类实现逻辑统一,即可正常生成符合格式的xls文件。
生效验证
修复后生成xls文件,首先对比文件大小是否和测试环境生成的同内容文件一致,也可以用二进制查看工具确认文件头为D0 CF 11 E0(标准xls文件的魔数标识),再用Excel打开验证即可。
内容的提问来源于stack exchange,提问作者subbanarasa reddy
相关产品推荐
相关产品推荐

