最近碰到了一个老项目使用poi导出6万行,40多列数据导致服务器内存吃满,cpu飙高的问题。
Apache poi存在一个严重的问题就是非常的耗内存。如果你的系统并发量不大的话可能还行但是一旦并发上来后,一定会OOM或者JVM频繁的full gc。
所以打算用EasyExcel替换原来代码中的Apache poi,但是,老项目中用到poi的地方比较多,有的地方确定也不会有大数据量的导出,所以,打算只优化几个接口。那么,就需要在代码里同时使用EasyExcel和Apache poi。
此时,pom文件里的依赖配置如下:
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>3.3.0</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.16</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.16</version>
</dependency>
修改代码。运行测试后发生了报错:
com.alibaba.excel.exception.ExcelGenerateException: java.lang.NoClassDefFoundError: com/alibaba/excel/support/util/CollectionUtils
最后发现问题是,easyexcel和Apache poi的依赖冲突,easyexcel是基于poi开发的,也就是说,它本身就有poi的依赖,那么此时同时使用就会造成依赖冲突。
优化依赖配置为:
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel-core</artifactId>
<version>3.2.1</version>
<exclusions>
<exclusion>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
</exclusion>
<exclusion>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
</exclusion>
<exclusion>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml-schemas</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.16</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.16</version>
</dependency>
手动排除easyexcel的Apache poi依赖,重新启动项目,运行依旧报错:
这个报错是因为导出过程中有日期类型数据,需要自定义转换器,具体解决办法可以参考:
https://www.cnblogs.com/asingh/p/14976074.html
依赖冲突问题参考自这位老哥:
EasyExcel工具使用时报错:org/apache/poi/ss/usermodel/Date1904Support找不到-CSDN博客