EasyExcel与Apache POI版本冲突导致`NoSuchMethodError`异常的解决方法

 更新时间:2025年11月13日 08:37:04   作者:代码怪兽大大作战  
本文介绍了EasyExcel与ApachePOI版本冲突导致`NoSuchMethodError`异常的原因,并提供了两种解决方案:排除EasyExcel自带的POI并手动指定统一版本,或者移除自己引入的POI,同时,也强调了在使用EasyExcel时避免单独引入POI的重要性,需要的朋友可以参考下

最近在使用 EasyExcel 导出 Excel 时,遇到了类似这样的异常:

Caused by: java.lang.NoSuchMethodError: org.apache.poi.util.StringUtil.isNotBlank(Ljava/lang/CharSequence;)Z
    at org.apache.poi.openxml4j.opc.OPCPackage.close(OPCPackage.java:462)
    at org.apache.poi.ooxml.POIXMLDocument.close(POIXMLDocument.java:189)
    at org.apache.poi.xssf.usermodel.XSSFWorkbook.close(XSSFWorkbook.java:610)
    at org.apache.poi.xssf.streaming.SXSSFWorkbook.close(SXSSFWorkbook.java:972)
    at com.alibaba.excel.context.WriteContextImpl.finish(WriteContextImpl.java:383)

这个错误在 Stack Overflow 和国内社区里都出现过很多次。

看起来像是 POI 的 bug,但其实 根本原因是 “依赖冲突 + 版本不兼容”

一、背景:EasyExcel 与 Apache POI 的关系

阿里巴巴的 EasyExcel 是一个基于 Apache POI 封装的轻量级 Excel 操作框架。

也就是说:

  • EasyExcel 本身不直接操作 XLSX 文件;
  • 它在底层依然依赖 Apache POI(poi、poi-ooxml、poi-ooxml-schemas) 来读写文件。

因此,当你的项目中出现多个 POI 版本时,很容易导致类加载冲突。

二、典型错误场景

场景一:项目中已引入了 POI,再引入 EasyExcel

举个例子:

<!-- 你自己引入的 POI -->
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>3.17</version>
</dependency>

<!-- 后来又加了 EasyExcel -->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>easyexcel</artifactId>
    <version>4.0.3</version>
</dependency>

这时候,项目中会同时存在两套 POI 版本:

依赖来源版本特点
你自己的 POI3.17老版本,没有 StringUtil.isNotBlank 方法
EasyExcel 内部 POI4.x新版本,增加了 isNotBlank 方法

当 JVM 加载类时,如果先加载了旧版本的 poi

EasyExcel 内部再去调用新版本方法(例如 StringUtil.isNotBlank(CharSequence)),

就会抛出:

NoSuchMethodError: org.apache.poi.util.StringUtil.isNotBlank(Ljava/lang/CharSequence;)Z

本质原因:运行时类加载顺序导致的 方法签名缺失

场景二:EasyExcel 与 POI 版本不兼容

即使你只引入了 EasyExcel,一些 IDE 或父依赖(如 Spring Boot Starter)可能传递进了 不兼容版本的 POI

例如:

  • EasyExcel 4.0.3 编译依赖 POI 4.1.2;
  • 但 Spring Boot 传递进了 POI 5.2.x;
  • 运行时会出现某些类或方法签名不匹配(比如 StringUtil.isNotBlankPOIXMLDocument.close)。

本质原因:EasyExcel 依赖的 POI 方法签名在高版本中被修改或删除。

三、解决方案

方案一:排除 EasyExcel 自带的 POI,手动指定统一版本(推荐)

<!--  EasyExcel 导出(排除内部 POI 依赖) -->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>easyexcel</artifactId>
    <version>4.0.3</version>
    <exclusions>
        <exclusion>
            <groupId>javax.servlet</groupId>
            <artifactId>servlet-api</artifactId>
        </exclusion>
        <exclusion>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
        </exclusion>
        <exclusion>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
        </exclusion>
        <exclusion>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml-schemas</artifactId>
        </exclusion>
    </exclusions>
</dependency>

<!--  手动指定兼容版本 POI(与 EasyExcel 4.0.3 完美匹配) -->
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>4.1.2</version>
</dependency>

说明:EasyExcel 4.0.3 的源码中基于 POI 4.1.x 版本构建,因此与之兼容性最佳。

方案二:如果项目不直接使用 POI,直接移除自己引入的 POI

如果你的项目只通过 EasyExcel 操作 Excel,没有直接使用 POI 的 API,

那么最简单的方式是删除多余的 POI 依赖:

<!-- 保留 EasyExcel 即可 -->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>easyexcel</artifactId>
    <version>4.0.3</version>
</dependency>

四、总结

问题类型根本原因解决方式
依赖冲突项目中同时存在多个 POI 版本排除 EasyExcel 内部 POI,只保留一个版本
版本不兼容EasyExcel 与当前 POI 方法签名不同使用与 EasyExcel 匹配的 POI 版本(如 4.1.2)

最简单的经验法则:

  • 只用 EasyExcel → 不要单独引入 POI。
  • 同时用 POI + EasyExcel → 统一 POI 版本并排除 EasyExcel 自带的依赖。

结语:

NoSuchMethodError 并不是 EasyExcel 的 bug,而是依赖管理的问题。
只要理清依赖树、保持 POI 版本一致,就能彻底解决此类冲突。

到此这篇关于EasyExcel与Apache POI版本冲突导致`NoSuchMethodError`异常的解决方法的文章就介绍到这了,更多相关EasyExcel与Apache POI版本冲突内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Plugin ‘org.springframework.boot:spring-boot-maven-plugin:‘ not found的解决方案(亲测可用)

    Plugin ‘org.springframework.boot:spring-boot-maven-plug

    这篇文章给大家介绍了Plugin ‘org.springframework.boot:spring-boot-maven-plugin:‘ not found的解决方案,亲测可用,文中给出了两种解决方法,需要的朋友可以参考下
    2024-01-01
  • Java中的自旋锁解析

    Java中的自旋锁解析

    这篇文章主要介绍了Java中的自旋锁解析,自旋锁是指当一个线程尝试获取某个锁时,如果该锁已被其他线程占用,就一直循环检测锁是否被释放,而不是进入线程挂起或睡眠状态,需要的朋友可以参考下
    2023-10-10
  • mybatis如何使用注解实现一对多关联查询

    mybatis如何使用注解实现一对多关联查询

    这篇文章主要介绍了mybatis如何使用注解实现一对多关联查询的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07
  • Java锁升级机制超详细讲解(附实例代码)

    Java锁升级机制超详细讲解(附实例代码)

    Java中的synchronized锁会经历一个从无锁到偏向锁,再到轻量级锁,最后到重量级锁的升级过程,这种优化称为锁升级或锁膨胀,这篇文章主要介绍了Java锁升级机制超详细讲解的相关资料,需要的朋友可以参考下
    2025-06-06
  • 分析ABA问题的本质及其解决办法

    分析ABA问题的本质及其解决办法

    CAS的全称是compare and swap,它是java同步类的基础,java.util.concurrent中的同步类基本上都是使用CAS来实现其原子性的。本文将介绍ABA问题的本质及其解决办法。
    2021-06-06
  • 一文详解JavaWeb过滤器(Filter)

    一文详解JavaWeb过滤器(Filter)

    本文主要介绍了一文详解JavaWeb过滤器(Filter),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-05-05
  • 关于远程调用RestTemplate的使用避坑指南

    关于远程调用RestTemplate的使用避坑指南

    这篇文章主要介绍了关于远程调用RestTemplate的使用避坑指南,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-10-10
  • spring mvc中的@ModelAttribute注解示例介绍

    spring mvc中的@ModelAttribute注解示例介绍

    在Spring mvc中,注解@ModelAttribute是一个非常常用的注解,下面这篇文章主要给大家介绍了关于spring mvc中@ModelAttribute注解的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下。
    2017-09-09
  • Mybatis中Mapper标签总结大全

    Mybatis中Mapper标签总结大全

    这篇文章主要介绍了Mybatis中Mapper标签总结大全,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-06-06
  • Java利用配置重试策略解决超时问题

    Java利用配置重试策略解决超时问题

    在web应用中,由于网络原因或其他不可预测的原因,应用间会出现调用失败的情形,通过配置重试策略可以有效解决外在原因导致的系统故障。本文就来详细说说如何利用配置重试策略解决超时问题
    2022-10-10

最新评论