升级POI依赖后触发IndexOutOfBoundsException问题求助
问题:POI版本升级后写入Excel触发IndexOutOfBoundsException
依赖变更详情
原依赖配置
<dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>4.0.1</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>4.0.1</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-contrib</artifactId> <version>3.6</version> </dependency>
修改后的依赖配置
<dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>5.2.3</version> <exclusions> <exclusion> <groupId>log4j</groupId> <artifactId>log4j</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>5.2.3</version> <exclusions> <exclusion> <groupId>log4j</groupId> <artifactId>log4j</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-contrib</artifactId> <version>3.6</version> <exclusions> <exclusion> <groupId>log4j</groupId> <artifactId>log4j</artifactId> </exclusion> </exclusions> </dependency>
触发的异常信息
13:27:42.929 [main] INFO com..Main - Exception thrown: java.lang.IndexOutOfBoundsException: null at org.apache.xmlbeans.impl.store.Xobj.removeElement(Xobj.java:2099) ~[xmlbeans-5.1.1.jar:?] at org.apache.xmlbeans.impl.store.Xobj.remove_element(Xobj.java:2130) ~[xmlbeans-5.1.1.jar:?] at org.openxmlformats.schemas.spreadsheetml.x2006.main.impl.CTRowImpl.removeC(CTRowImpl.java:146) ~[poi-ooxml-lite-5.2.3.jar:5.2.3] at org.apache.poi.xssf.usermodel.XSSFRow.fixupCTCells(XSSFRow.java:612) ~[poi-ooxml-5.2.3.jar:5.2.3] at org.apache.poi.xssf.usermodel.XSSFRow.onDocumentWrite(XSSFRow.java:582) ~[poi-ooxml-5.2.3.jar:5.2.3] at org.apache.poi.xssf.usermodel.XSSFSheet.write(XSSFSheet.java:3806) ~[poi-ooxml-5.2.3.jar:5.2.3] at org.apache.poi.xssf.usermodel.XSSFSheet.commit(XSSFSheet.java:3749) ~[poi-ooxml-5.2.3.jar:5.2.3] at org.apache.poi.ooxml.POIXMLDocumentPart.onSave(POIXMLDocumentPart.java:467) ~[poi-ooxml-5.2.3.jar:5.2.3] at org.apache.poi.ooxml.POIXMLDocumentPart.onSave(POIXMLDocumentPart.java:472) ~[poi-ooxml-5.2.3.jar:5.2.3] at org.apache.poi.ooxml.POIXMLDocument.write(POIXMLDocument.java:221) ~[poi-ooxml-5.2.3.jar:5.2.3] at com..workbook.WorkbookHandler.writeWorkbook(WorkbookHandler.java:341) ~[DailyTrends-Reports.jar:?] at com..workbook.ExecutiveWorkbookHandler.generate(ExecutiveWorkbookHandler.java:90) ~[DailyTrends-Reports.jar:?] at com..Main.main(Main.java:64) [DailyTrends-Reports.jar:?]
背景说明
本次变更目标为移除log4j传递依赖,初期不确定依赖来源,因此在多个依赖中添加了排除规则,同时将POI核心版本从4.0.1升级到5.2.3。目前已确认log4j传递依赖仅来自poi-contrib,且已成功移除,但出现上述异常,需排查原因。
排查方向建议
- 版本兼容性问题:poi-contrib 3.6与POI 5.2.3版本跨度极大,存在严重的API和依赖冲突风险。poi-contrib在POI 3.10之后已被废弃,后续功能整合到poi-ooxml等核心模块中,建议直接移除poi-contrib依赖,替换为POI 5.2.3对应的功能实现。
- Excel行处理逻辑冲突:异常发生在
XSSFRow.fixupCTCells方法,该方法用于清理行中无效的单元格数据。检查代码中是否存在对行/单元格的重复操作(如多次删除同一单元格、修改行索引导致的单元格位置异常),POI 5.x对单元格的校验逻辑比4.x更严格。 - XMLBeans版本适配:POI 5.2.3依赖xmlbeans 5.1.1,而旧版poi-contrib可能依赖低版本xmlbeans,虽然Maven会选择高版本,但存在潜在的类加载冲突。可通过
mvn dependency:tree确认xmlbeans的最终依赖版本,确保没有多版本共存。 - 排除规则的影响:POI 5.x默认使用slf4j而非log4j,原本不会引入log4j,poi和poi-ooxml的排除规则属于多余操作,可尝试移除这些排除规则,确认是否因排除操作导致依赖缺失。
- 调试单元格状态:在写入Excel前,添加日志输出目标行的单元格数量、索引范围,确认是否存在索引越界的单元格(如单元格索引为负数、或超出当前行允许的最大索引),POI 5.x对这类非法状态的处理更严格。
内容的提问来源于stack exchange,提问作者what's_in_a_name
相关产品推荐
相关产品推荐

