先看一个典型的错误场景:在WAS服务器上导出Excel报表时,突然抛出一个ja va.lang.NoClassDefFoundError: org.openxmlformats.schemas.spreadsheetml.x2006.main.CTFileRecoveryPr,异常堆栈一路从POI的servlet OUTEXCEL服务方法里冒出来,最终导致导出失败。而在Tomcat下跑同样的代码,可能一切正常——这问题,是不是让人有点抓狂?
问题的根源:jar包“精简版”惹的祸
经过排查,问题的根源其实在jar包上。POI的poi-ooxml-schemas,本质上是完整ooxml-schemas的精简版,只包含了常用部分。在WAS这类服务器上,导出Excel时如果依赖到某些未包含的schemas,就会直接翻车。Tomcat下之所以没事,是因为它通常不care这些完整schemas的缺失,但WAS会更严格。
解决思路其实很简单:统一jar包版本,使用完整的ooxml-schemas-1.1.jar。这里有个细节值得注意:POI 3.5和3.6用的是ooxml-schemas-1.0.jar,到了3.7就升级到了1.1版本,主要是加入了泛型支持。你可以用1.1版本兼容3.5和3.6,但反过来,POI 3.7可不认1.0版本——它需要新版。
官方FAQ里也明确了这一点:
“There are two jar files a vailable, as described in the components overview section. The full jar of all of the schemas is ooxml-schemas-1.1.jar, and it is currently around 15mb. The smaller poi-ooxml-schemas jar is only about 4mb. This latter jar file only contains the typically used parts though.”
说白了,就是用4MB的精简版赌一把,还是用15MB的完整版保平安——看你部署的环境有多“挑剔”。
Ma ven项目的解决方案
对于Ma ven项目,调整依赖即可。把原来那个精简版poi-ooxml-schemas注释掉,换成完整的ooxml-schemas:
org.apache.poi
ooxml-schemas
1.1
然后重启服务,导出Excel应该就恢复正常了。
顺便提一句,POI 3.9正常工作需要以下几个核心jar包,缺一不可:
org.apache.poi
poi
3.9
org.apache.poi
poi-ooxml
3.9
dom4j
dom4j
1.6.1
org.apache.xmlbeans
xmlbeans
2.3.0
stax
stax-api
1.0.1
org.apache.poi
ooxml-schemas
1.1
普通Web工程的解决方案
如果是非Ma ven项目,直接去下载对应jar包放到lib目录下就行。Ma ven中央仓库的下载地址:
https://search.ma ven.org/#artifactdetails|org.apache.poi|ooxml-schemas|1.1|jar

总之,遇到这类NoClassDefFoundError,首先要怀疑的不是代码逻辑,而是环境差异和jar包版本的一致性。WAS服务器对类加载的严密性远超Tomcat,所以本地测试通过不代表生产环境就稳了——提前踩坑,总比上线后炸锅强。
