EasyExcel與Apache POI版本沖突導(dǎo)致`NoSuchMethodError`異常的解決方法
最近在使用 EasyExcel 導(dǎo)出 Excel 時(shí),遇到了類似這樣的異常:

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)
這個(gè)錯(cuò)誤在 Stack Overflow 和國內(nèi)社區(qū)里都出現(xiàn)過很多次。
看起來像是 POI 的 bug,但其實(shí) 根本原因是 “依賴沖突 + 版本不兼容”。
一、背景:EasyExcel 與 Apache POI 的關(guān)系
阿里巴巴的 EasyExcel 是一個(gè)基于 Apache POI 封裝的輕量級(jí) Excel 操作框架。
也就是說:
- EasyExcel 本身不直接操作 XLSX 文件;
- 它在底層依然依賴 Apache POI(poi、poi-ooxml、poi-ooxml-schemas) 來讀寫文件。
因此,當(dāng)你的項(xiàng)目中出現(xiàn)多個(gè) POI 版本時(shí),很容易導(dǎo)致類加載沖突。
二、典型錯(cuò)誤場(chǎng)景
場(chǎng)景一:項(xiàng)目中已引入了 POI,再引入 EasyExcel
舉個(gè)例子:
<!-- 你自己引入的 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>
這時(shí)候,項(xiàng)目中會(huì)同時(shí)存在兩套 POI 版本:
| 依賴來源 | 版本 | 特點(diǎn) |
|---|---|---|
| 你自己的 POI | 3.17 | 老版本,沒有 StringUtil.isNotBlank 方法 |
| EasyExcel 內(nèi)部 POI | 4.x | 新版本,增加了 isNotBlank 方法 |
當(dāng) JVM 加載類時(shí),如果先加載了舊版本的 poi,
EasyExcel 內(nèi)部再去調(diào)用新版本方法(例如 StringUtil.isNotBlank(CharSequence)),
就會(huì)拋出:
NoSuchMethodError: org.apache.poi.util.StringUtil.isNotBlank(Ljava/lang/CharSequence;)Z
本質(zhì)原因:運(yùn)行時(shí)類加載順序?qū)е碌?方法簽名缺失。
場(chǎng)景二:EasyExcel 與 POI 版本不兼容
即使你只引入了 EasyExcel,一些 IDE 或父依賴(如 Spring Boot Starter)可能傳遞進(jìn)了 不兼容版本的 POI。
例如:
- EasyExcel 4.0.3 編譯依賴 POI 4.1.2;
- 但 Spring Boot 傳遞進(jìn)了 POI 5.2.x;
- 運(yùn)行時(shí)會(huì)出現(xiàn)某些類或方法簽名不匹配(比如
StringUtil.isNotBlank、POIXMLDocument.close)。
本質(zhì)原因:EasyExcel 依賴的 POI 方法簽名在高版本中被修改或刪除。
三、解決方案
方案一:排除 EasyExcel 自帶的 POI,手動(dòng)指定統(tǒng)一版本(推薦)
<!-- EasyExcel 導(dǎo)出(排除內(nèi)部 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>
<!-- 手動(dòng)指定兼容版本 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 版本構(gòu)建,因此與之兼容性最佳。
方案二:如果項(xiàng)目不直接使用 POI,直接移除自己引入的 POI
如果你的項(xiàng)目只通過 EasyExcel 操作 Excel,沒有直接使用 POI 的 API,
那么最簡單的方式是刪除多余的 POI 依賴:
<!-- 保留 EasyExcel 即可 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>4.0.3</version>
</dependency>
四、總結(jié)
| 問題類型 | 根本原因 | 解決方式 |
|---|---|---|
| 依賴沖突 | 項(xiàng)目中同時(shí)存在多個(gè) POI 版本 | 排除 EasyExcel 內(nèi)部 POI,只保留一個(gè)版本 |
| 版本不兼容 | EasyExcel 與當(dāng)前 POI 方法簽名不同 | 使用與 EasyExcel 匹配的 POI 版本(如 4.1.2) |
最簡單的經(jīng)驗(yàn)法則:
- 只用 EasyExcel → 不要單獨(dú)引入 POI。
- 同時(shí)用 POI + EasyExcel → 統(tǒng)一 POI 版本并排除 EasyExcel 自帶的依賴。
結(jié)語:
NoSuchMethodError 并不是 EasyExcel 的 bug,而是依賴管理的問題。
只要理清依賴樹、保持 POI 版本一致,就能徹底解決此類沖突。
到此這篇關(guān)于EasyExcel與Apache POI版本沖突導(dǎo)致`NoSuchMethodError`異常的解決方法的文章就介紹到這了,更多相關(guān)EasyExcel與Apache POI版本沖突內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- java項(xiàng)目中NoSuchMethodError錯(cuò)誤的觸發(fā)場(chǎng)景與解決方案
- 一文帶你解決Java項(xiàng)目開發(fā)中java.lang.NoSuchMethodError的問題
- Maven包沖突導(dǎo)致NoSuchMethodError錯(cuò)誤的解決辦法
- 詳解Matisse與Glide--java.lang.NoSuchMethodError:com.bumptech.glide.RequestManager.load
- Java異常 Factory method''sqlSessionFactory''rew exception;ested exception is java.lang.NoSuchMethodError:
相關(guān)文章
Plugin ‘org.springframework.boot:spring-boot-maven-plug
這篇文章給大家介紹了Plugin ‘org.springframework.boot:spring-boot-maven-plugin:‘ not found的解決方案,親測(cè)可用,文中給出了兩種解決方法,需要的朋友可以參考下2024-01-01
mybatis如何使用注解實(shí)現(xiàn)一對(duì)多關(guān)聯(lián)查詢
這篇文章主要介紹了mybatis如何使用注解實(shí)現(xiàn)一對(duì)多關(guān)聯(lián)查詢的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07
Java鎖升級(jí)機(jī)制超詳細(xì)講解(附實(shí)例代碼)
Java中的synchronized鎖會(huì)經(jīng)歷一個(gè)從無鎖到偏向鎖,再到輕量級(jí)鎖,最后到重量級(jí)鎖的升級(jí)過程,這種優(yōu)化稱為鎖升級(jí)或鎖膨脹,這篇文章主要介紹了Java鎖升級(jí)機(jī)制超詳細(xì)講解的相關(guān)資料,需要的朋友可以參考下2025-06-06
關(guān)于遠(yuǎn)程調(diào)用RestTemplate的使用避坑指南
這篇文章主要介紹了關(guān)于遠(yuǎn)程調(diào)用RestTemplate的使用避坑指南,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-10-10
spring mvc中的@ModelAttribute注解示例介紹
在Spring mvc中,注解@ModelAttribute是一個(gè)非常常用的注解,下面這篇文章主要給大家介紹了關(guān)于spring mvc中@ModelAttribute注解的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下。2017-09-09
Mybatis中Mapper標(biāo)簽總結(jié)大全
這篇文章主要介紹了Mybatis中Mapper標(biāo)簽總結(jié)大全,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06

