EasyExcel 几十万导入报错问题——java.lang.NoClassDefFoundError

news2024/11/27 21:53:19

EasyExcel 报错 NoClassDefFoundError org/ehcache/config/builders/CacheManagerBuilder

特此郑重声明!该文章是原创作品,小编编写实属不易 ,帮忙点赞关注一下~转载小伙伴请注明出处!

EasyExcel 导入几十万数据报错

今天在执行海量数据数据导入的过程中,当Excel 文件内容超过30W ,就出现导入失败。

报错内容如下:

com.alibaba.excel.exception.ExcelAnalysisException: java.lang.NoClassDefFoundError: org/ehcache/config/builders/CacheManagerBuilder
	at com.alibaba.excel.analysis.ExcelAnalyserImpl.<init>(ExcelAnalyserImpl.java:57) ~[easyexcel-2.2.10.jar:na]
	at com.alibaba.excel.ExcelReader.<init>(ExcelReader.java:145) ~[easyexcel-2.2.10.jar:na]
	at com.alibaba.excel.read.builder.ExcelReaderBuilder.build(ExcelReaderBuilder.java:193) ~[easyexcel-2.2.10.jar:na]
	at com.alibaba.excel.read.builder.ExcelReaderBuilder.sheet(ExcelReaderBuilder.java:229) ~[easyexcel-2.2.10.jar:na]
	at com.alibaba.excel.read.builder.ExcelReaderBuilder.sheet(ExcelReaderBuilder.java:217) ~[easyexcel-2.2.10.jar:na]
	at com.zkh360.customer.manage.controller.demo.ImportFileServive.importFile(ImportFileServive.java:47) ~[classes/:na]
	at com.zkh360.customer.manage.controller.demo.FileController.importFile(FileController.java:28) ~[classes/:na]
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_131]
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_131]
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_131]
	at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_131]
	at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:190) ~[spring-web-5.2.9.RELEASE.jar:5.2.9.RELEASE]
	at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:138) ~[spring-web-5.2.9.RELEASE.jar:5.2.9.RELEASE]
	at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:105) ~[spring-webmvc-5.2.9.RELEASE.jar:5.2.9.RELEASE]
	at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:878) ~[spring-webmvc-5.2.9.RELEASE.jar:5.2.9.RELEASE]
	at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:792) ~[spring-webmvc-5.2.9.RELEASE.jar:5.2.9.RELEASE]
	at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) ~[spring-webmvc-5.2.9.RELEASE.jar:5.2.9.RELEASE]
	at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1040) ~[spring-webmvc-5.2.9.RELEASE.jar:5.2.9.RELEASE]
	at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943) ~[spring-webmvc-5.2.9.RELEASE.jar:5.2.9.RELEASE]
	at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) [spring-webmvc-5.2.9.RELEASE.jar:5.2.9.RELEASE]
	at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909) [spring-webmvc-5.2.9.RELEASE.jar:5.2.9.RELEASE]
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:665) [javax.servlet-api-4.0.1.jar:4.0.1]
	at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) [spring-webmvc-5.2.9.RELEASE.jar:5.2.9.RELEASE]
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:750) [javax.servlet-api-4.0.1.jar:4.0.1]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) [tomcat-embed-core-9.0.38.jar:9.0.38]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [tomcat-embed-core-9.0.38.jar:9.0.38]
	at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) [tomcat-embed-websocket-9.0.38.jar:9.0.38]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) [tomcat-embed-core-9.0.38.jar:9.0.38]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [tomcat-embed-core-9.0.38.jar:9.0.38]
	at com.alibaba.druid.support.http.WebStatFilter.doFilter(WebStatFilter.java:123) [druid-1.1.10.jar:1.1.10]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) [tomcat-embed-core-9.0.38.jar:9.0.38]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [tomcat-embed-core-9.0.38.jar:9.0.38]
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:320) [spring-security-web-5.3.4.RELEASE.jar:5.3.4.RELEASE]
	at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:126) [spring-security-web-5.3.4.RELEASE.jar:5.3.4.RELEASE]
	at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:90) [spring-security-web-5.3.4.RELEASE.jar:5.3.4.RELEASE]

本人EasyExcel 使用的版本:Version 2.2.10

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>easyexcel</artifactId>
            <version>2.2.10</version>
        </dependency>

代码如下:

@Slf4j
@Service
public class ImportFileServive implements FileImport {
    @Override
    public void importFile(MultipartFile file) {
        try (InputStream in = file.getInputStream()) {
            Workbook workBook = null;
            List<ExcelDataVo> list = EasyExcel.read(file.getInputStream()).head(ExcelDataVo.class).sheet().headRowNumber(1).doReadSync();
            log.info("实际获取数据:{}",list.size())
        } catch (IOException e) {
            log.error("importExcel failed IOException", e);
        }
    }

}

@Data
public class ExcelDataVo {
    @ExcelProperty("Id")
    private String id;
    @ExcelProperty("custNumber")
    private String custName;
    @ExcelProperty("custNumber")
    private String custNumber;
    @ExcelProperty("text01")
    private String text01;
    @ExcelProperty("text02")
    private String text02;
    @ExcelProperty("text03")
    private String text03;
    @ExcelProperty("text04")
    private String text04;
    @ExcelProperty("text05")
    private String text05;
}


    问题定位

    经过定位EasyExcel官网 发现
    EasyExcel 在使用过程中 超过5M 会使用Ehcache
    在这里插入图片描述
    我这边本地代码 由于Ehcache 是一个老版本3.0 的版本,初步猜测 版本导致 。

    解决思路

    方案一

    直接 升级ehcache 版本
    <dependency>
                <groupId>org.ehcache</groupId>
                <artifactId>ehcache</artifactId>
                <version>3.9.9</version>
                <scope>compile</scope>
            </dependency>
    

    PS : 注意easyexcel 如果使用 低版本的 easyexcel 需要将其 exclusions 掉

     <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>easyexcel</artifactId>
            <version>2.2.10</version>
            <exclusions>
                <exclusion>
                    <groupId>org.ehcache</groupId>
                    <artifactId>ehcache</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    
    

    方案二 采用MapCache 替换解决

    有的小伙伴在开发过程,可能改的老代码强制升级可能让原始代码使用Ehcache 功能过程收到影响

    对于一个优秀程序员来说,老代码程序能跑就不要轻易大改!!!

    在这里插入图片描述
    在原始代码中加入 readCache(new MapCache())

    @Slf4j
    @Service
    public class ImportFileServive implements FileImport {
        @Override
        public void importFile(MultipartFile file) {
            try (InputStream in = file.getInputStream()) {
                Workbook workBook = null;
                List<ExcelDataVo> list = EasyExcel.read(file.getInputStream()).readCache(new MapCache()).head(ExcelDataVo.class).sheet().headRowNumber(1).doReadSync();
                log.info("实际获取数据:{}",list.size())
            } catch (IOException e) {
                log.error("importExcel failed IOException", e);
            }
        }
    }
    

    MapCache 本质就是一个HashMap

    在这里插入图片描述

    运行程序 !解决!

    本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/364455.html

    如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

    相关文章

    【java实现Word模板导出】Xdocreport和Freemaker

    如果只是生成简单的word文件的话可以使用 Hutool 上手简单使用方便。 但如果需要导出内容比较复杂的word文件的话用那个就不合适了&#xff0c;这时候就需要Xdocreport这玩意了。 制作模板 新建一个word文档在需要插入变量的地方使用快捷键 Crtl F9 来生成一个域 然后右键单…

    【软件工具】Source Insight 4.0编辑keil工程代码

    0.前言 最近在学习过程中&#xff0c;发现诸多课程老师均使用Source Insight 4.0进行开发演示&#xff0c;为了方便课程的学习&#xff0c;也为了提高个人开发水平及效率&#xff0c;故学习Source Insight 4.0软件&#xff0c;此文章主要作为软件使用的流程总结&#xff0c;同…

    第十一章 - 模糊匹配(like)、正则匹配(REGEXP)、文本处理函数、时间处理函数

    第十一章 - 模糊匹配&#xff08;like&#xff09;、正则匹配&#xff08;REGEXP&#xff09;、文本处理函数、时间处理函数模糊匹配和正则匹配like%通配符_通配符REGEXP 正则匹配文本拼接concat&#xff08;&#xff09;substring()substring_index()一些文本处理函数时间处理…

    Autosar MCAL-ADC配置PWM硬件触发采样

    文章目录前言ADC配置AdcGroupRequestSourceAdcGroupTriggSrcAdcHwExtTrigSelectAdcHwGatePinAdcGeneral-AdcHwTriggerApiAdcHwGateSignalAdcHwTrigSignalAdcHwTrigTypeGtmGtmConnectionsPWM实际使用总结前言 在实际项目开发过程中&#xff0c;关于ADC采样&#xff0c;大部分使…

    存储器与cpu的连接

    1. 只读存储器 只读存储器中一般用于保存系统程序或者系统的配置信息&#xff1b; 早期的只读存储器&#xff0c; 在厂家就写好了内容改进&#xff11;&#xff0c; 用户可以自己写&#xff0c; 一次性改进2, 可以多次写-- 要能对信息进行擦除&#xff1b;改进3,  电可擦…

    【Leetcode 剑指Offer】第3天 字符串(简单)

    字符串剑指 Offer 05. 替换空格字符串构造函数和析构函数操作函数剑指 Offer 58 - II. 左旋转字符串剑指 Offer 05. 替换空格 题&#xff1a;实现一个函数&#xff0c;把字符串 s 中的每个空格替换成"%20"。 class Solution { public:string replaceSpace(string s…

    华为OD机试真题 用 C++ 实现 - 单词反转

    最近更新的博客 华为OD机试 - 入栈出栈(C++) | 附带编码思路 【2023】 华为OD机试 - 箱子之形摆放(C++) | 附带编码思路 【2023】 华为OD机试 - 简易内存池 2(C++) | 附带编码思路 【2023】 华为OD机试 - 第 N 个排列(C++) | 附带编码思路 【2023】 华为OD机试 - 考古…

    Springcloud-Seata分布式事务

    目录 一、什么是Seata&#xff1f; 二、Seata的执行流程 三、搭建Seata服务器 四、配置微服务客户端 分布式事务的解决办法: 使用消息中间件手写代码解决分布式事务使用第三方组件--->Seata阿里巴巴的产品 这里只介绍通过第三方插件-----Seata解决分布式事务的问题 一、什…

    说说 React 中 fiber、DOM、ReactElement、实例对象之间的引用关系

    原生组件 fiber 原生组件 fiber&#xff0c;指的就是 type 为 “span”、“div” 的 fiber。 1.fiber.stateNode 指向真实 DOM 节点&#xff1b;2.node["__reactFiber$" randomKey] 指向对应 fiber&#xff0c;使用随机数是防止和业务代码的属性名冲突&#xff0c;…

    【系统设计】攻击技术

    一、跨站脚本攻击 概念 跨站脚本攻击&#xff08;Cross-Site Scripting, XSS&#xff09;&#xff0c;是指恶意攻击者在Web页面中插入恶意javascript代码&#xff08;也可能包含html代码&#xff09;&#xff0c;当用户浏览网页之时&#xff0c;嵌入其中Web里面的javascript代…

    python | 第八、九章考试题

    本篇文章是对北京理工大学嵩天老师的《Python语言程序设计》第八章&#xff1a;程序设计方法学、第九章&#xff1a;Python计算生态纵览考试题的学习记录。 目录 一、第八章考试题 1、英文字符的鲁棒输入 2、数字的鲁棒输入 二、第九章考试题 1、系统基本信息获取 2、二…

    JavaScript学习第2天:JS内置对象、简单数据类型与复杂类型

    一、内置对象 JavaScript 中的对象分为3种&#xff1a;自定义对象 、内置对象、 浏览器对象 前面两种对象是JS 基础内容&#xff0c;属于 ECMAScript&#xff1b; 第三个浏览器对象属于JS 独有的 1、内置对象 内置对象就是指 JS 语言自带的一些对象。 JavaScript 提供了多个…

    关于java8的List的stream流的foreach()方法问题探究(坑)与替代方案

    一、起因 今天发现线上系统出现了一个bug&#xff0c; 我有一个“定时任务”每天凌晨触发&#xff0c;任务内容&#xff1a; ① 定时调用的系统暴漏的接口&#xff0c;来定时获取List<Object>数据。 ② 然后我会筛选出该List中符合条件的Object&#xff0c;对筛选出来的…

    数组类模板

    要求&#xff1a;设计一个数组模板类&#xff08;MyArray&#xff09;&#xff0c;完成对不同类型元素的管理操作步骤设计头文件在 qtcreate下先创建03_code的项目&#xff0c;然后右键点击03_code添加新文件&#xff0c;点击头文件&#xff0c;点击Choose命名为 myarry.hpp&am…

    产品运营︱用户活跃度低的解决方法

    app用户活跃度低&#xff0c;产品拉新变现效率慢&#xff0c;这是运营app时难免会遇到的情况。要想解决这类问题&#xff0c;就要从可能的原因下手&#xff0c;进行产品的优化改进&#xff0c;记录下改变后的关键数据变化&#xff0c;定期做好复盘工作进行调整。 一、app用户量…

    117.Android 简单的拖拽列表+防止越界拖动(BaseRecyclerViewAdapterHelper)

    //1.第一步 导入依赖库和权限&#xff1a; //依赖库&#xff1a; //RecyclerView implementation com.android.support:recyclerview-v7:28.0.0//RecyclerAdapter implementation com.github.CymChad:BaseRecyclerViewAdapterHelper:2.9.28 //用到的权限&#xff1a; <!…

    【华为OD机试模拟题】用 C++ 实现 - 求最大数字

    最近更新的博客 华为OD机试 - 入栈出栈(C++) | 附带编码思路 【2023】 华为OD机试 - 箱子之形摆放(C++) | 附带编码思路 【2023】 华为OD机试 - 简易内存池 2(C++) | 附带编码思路 【2023】 华为OD机试 - 第 N 个排列(C++) | 附带编码思路 【2023】 华为OD机试 - 考古…

    优思学院:六西格玛管理的优势有哪些?

    六西格玛的优势有哪些呢&#xff1f;以下我们来探讨一下。 一・降低企业整体成本 对企业而言&#xff0c;不良品要么被废弃&#xff0c;要么需要重新加工&#xff0c;或者需要在客户现场维修或更换&#xff0c;这些都会增加企业成本。根据美国的统计数据&#xff0c;执行3σ管…

    搭建Scala集成开发环境

    文章目录前言搭建Scala集成开发环境&#xff08;一&#xff09;启动IDEA&#xff08;二&#xff09;安装Scala插件&#xff08;四&#xff09;创建Scala项目1、创建Scala项目 - ScalaDemo012、创建Scala类 - HelloWorld3、创建Scala单例对象 - TestHelloWorld&#xff08;五&am…

    HIVE 基础(四)

    目录 分桶&#xff08;Bucket&#xff09; 设定属性 定义分桶 案例 建表语句 表数据 上传到数据 创建分桶语句 加载数据 分桶抽样&#xff08;Sampling&#xff09; 随机抽样---整行数据 随机抽样---指定列 随机抽样---百分比 随机抽样---抽取行数 Hive视图&#…