初始化XSSFWorkbook时报java.lang.NoSuchFieldError: Factory错误如何解决
问题根因
- 核心为依赖版本不兼容:Apache POI 5.x 版本已废弃旧版
ooxml-schemas 1.x系列依赖,你引入的ooxml-schemas-1.3是 POI 3.x/4.x 版本的配套组件,和 POI 5.1.0 依赖的 XmlBeans 5.x 体系完全不兼容,会导致CT类的Factory初始化时出现类加载冲突、方法缺失类异常,这就是你执行(CTWorkbook)CTWorkbook.Factory.newInstance();时报错、XSSFWorkbook初始化卡住的直接原因。 - 次要排查点:你当前引入的
xmlbeans-5.0.2与POI 5.1.0版本匹配,无需调整,只需确认项目中没有其他低版本XmlBeans被间接引入即可。
解决方案
- 完全移除项目中的
ooxml-schemas-1.3依赖 - 引入POI 5.1.0配套的OOXML Schema依赖,根据使用场景二选一:
- 常规Excel导入导出场景选择轻量版:
poi-ooxml-lite-5.1.0,已包含Excel操作所需的所有核心CT类,体积更小加载速度更快 - 需要操作Office高级特性(如自定义扩展样式、VBA读写等)时选择全量版:
poi-ooxml-full-5.1.0
- 常规Excel导入导出场景选择轻量版:
- 清理项目依赖缓存后重新编译运行即可恢复正常。
如果使用Maven管理依赖,建议引入POI官方的BOM统一管理所有POI相关组件版本,避免零散引入导致的版本不一致问题:
<dependencyManagement> <dependencies> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-bom</artifactId> <version>5.1.0</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
后续引入poi、poi-ooxml、poi-ooxml-lite等依赖时无需再指定版本号,会自动与BOM版本保持一致。
内容的提问来源于stack exchange,提问作者Stefan Juganaru
相关产品推荐
相关产品推荐

