欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  科技

easyExcel读取大文件NoClassDefFoundError或者NoSuchMethodException等问题

程序员文章站 2022-03-10 17:13:55
文章目录jar包问题首先看easyExcel官方介绍指定excel使用的缓存指定只使用默认(只用内存)指定Ehcache在默认或者指定EhCache时,出现了异常!!解决方法jar包问题在读取超级大文件(200MB的excel算大了吧)的时候出现各种的NoClassDefFoundError或者NoSuchMethodException等异常,而且异常信息都是有关Ehcache的首先看easyExcel官方介绍由介绍可以知道,在excel文件小于5M的时候,默认使用内存,大于5M会使用EhCac...

jar包问题

在读取超级大文件(200MB的excel算大了吧)的时候出现各种的NoClassDefFoundError或者NoSuchMethodException等异常,而且异常信息都是有关Ehcache的

easyExcel读取大文件NoClassDefFoundError或者NoSuchMethodException等问题

首先看easyExcel官方介绍

easyExcel读取大文件NoClassDefFoundError或者NoSuchMethodException等问题

由介绍可以知道,在excel文件小于5M的时候,默认使用内存,大于5M会使用EhCache缓存来处理。

那么就知道,上面报的错是因为文件太大,使用EhCache出现的问题

指定excel使用的缓存

指定只使用默认(只用内存)

public static void main(String[] args) {
    String fileName = "E:/test.xlsx";
    ExcelReader excelReader = null;
    try {
        excelReader = EasyExcel.read(fileName, new ImportExcel())
            .readCache(new MapCache())// 这里指定MapCache就是默认的全部用内存,不使用EhCache,但是这就要求内存要大
            .build();
        ReadSheet readSheet = EasyExcel.readSheet(0).build();
        excelReader.read(readSheet);
    } finally {
        if (excelReader != null) {
            // 这里千万别忘记关闭,读的时候会创建临时文件,到时磁盘会崩的
            excelReader.finish();
        }
    }
}

指定Ehcache

可以参考:https://blog.csdn.net/weixin_42528266/article/details/109237951

public static void main(String[] args) {
    String fileName = "E:/test.xlsx";
    ExcelReader excelReader = null;
    try {
        excelReader = EasyExcel.read(fileName, new ImportExcel())
            .readCacheSelector(new SimpleReadCacheSelector(20, 90))// 这里就是使用内存+磁盘,会用到EhCache
            .build();
        ReadSheet readSheet = EasyExcel.readSheet(0).build();
        excelReader.read(readSheet);
    } finally {
        if (excelReader != null) {
            // 这里千万别忘记关闭,读的时候会创建临时文件,到时磁盘会崩的
            excelReader.finish();
        }
    }
}

在默认或者指定EhCache时,出现了异常!!

由easyExcel的pom文件可知,easyExcel使用的EhCache是3.4.0版本
easyExcel读取大文件NoClassDefFoundError或者NoSuchMethodException等问题

为了看为啥EhCache报错,首先查看了项目打完包后的lib文件夹下,是不是有EhCache这个jar包

这个时候,如果你的项目的parent是springboot,那么你会发现,项目lib中,EhCachejar包的版本不是3.4.0,而是3.2.3。

因为springboot的版本管理中已经定义了EhCache的版本,这样打包的时候就会使用springboot中定义的版本

easyExcel读取大文件NoClassDefFoundError或者NoSuchMethodException等问题

这个原因导致了项目打完包后,easyExcel的EhCache版本被污染,导致报错

因为mven的继承和<dependencyManagement>版本管理,我们在自己的项目中没有定义EhCache版本,但又用到了EhCache,所以springboot的spring-boot-dependencies就会把版本帮我们继承过来。

解决方法

我们需要在我们项目顶层pom中,手动定义一下Ehcache的版本号为easyExcel中EhCache的版本号
easyExcel读取大文件NoClassDefFoundError或者NoSuchMethodException等问题

这样我们再把项目打包,去查看lib文件夹,会发现,EhCache的版本就是3.4.0,在读取超级大的Excel的时候,不管指不指定readCache,都不会报错了

本文地址:https://blog.csdn.net/qq_39030696/article/details/112273418