You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

升级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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 08:17:54