龙哥网

龙哥网

使用EasyExcel 导入表格数据是出现 空指针 java.lang.NullPointerException: null
2022-03-01

原代码如下

控制器中

 /** * easyExcel导入方式 * @return */
    @PostMapping("/importExcel")
    public R<?> importExcel(){ 
        //导入需要添加一个监听
        //1. 获取导入文件的路径
        String path = "C:\\Users\\YKT\\Desktop\\临时\\car.xls";
        //创建读入的excel的构造器 告诉其文件位置,要读那个java对象 以及读取监听器
        //读取之后 在监听器中插入数据库
        ExcelReader build = EasyExcel.read(path,Excel.class,new ExcelListener()).build();
        // 0 表示只导入第一个sheet表中的数据
        ReadSheet readSheet = EasyExcel.readSheet(0).build();
        build.read(readSheet);
        build.finish();

        return R.ok("导入成功!");
    }

监听器

package com.example.car.carmall.Listenner;

import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.example.car.carmall.domain.Excel;
import com.example.car.carmall.mapper.ExcelMapper;
import org.springframework.beans.factory.annotation.Autowired;

import java.text.SimpleDateFormat;
import java.util.Date;

/** * @author wcb 导入excel 监听器 * 创建读取监听器类 继承 AnalysisEventListener类 并将其要读取成的java对象传入泛型 * @date 2022 年 01月 13 日 11:42 */
public class ExcelListener extends AnalysisEventListener<Excel> { 

    @Autowired
    private ExcelMapper mapper;


    /** * 逐行读取 读取之后 在监听器中插入数据库 * @param excel * @param analysisContext */
    @Override
    public void invoke(Excel excel, AnalysisContext analysisContext) { 
        SimpleDateFormat dfs = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
        System.out.println(dfs.format(new Date()) +" ====== "+excel);
        //加入数据库
        mapper.insertIntoExcel(excel);
    }

    /** * 读取完毕触发执行 * @param analysisContext */
    @Override
    public void doAfterAllAnalysed(AnalysisContext analysisContext) { 
        System.out.println("finish");
    }
}

执行之后报错,如下:

2022-01-13 16:29:35.579  ======  Excel(id=1, carNo=云A9874, carType=宝马, carResources=null, carPhone=17787144154, day=10, price=300, useTime=20, outPrice=200, totalPrice=4000, custName=大兵, custPhone=17787144154, orderResource=百度, address=昆明, startTime=2021-10-05 13:33:29, createTime=null, endTime=2021-10-31 13:33:35, deposit=10000, backTime=2021-10-31 13:34:16, remark=记住, status=null)
2022-01-13 16:29:35.580 ERROR 9000 --- [nio-9090-exec-4] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is com.alibaba.excel.exception.ExcelAnalysisException] with root cause

java.lang.NullPointerException: null
	at com.example.car.carmall.Listenner.ExcelListener.invoke(ExcelListener.java:33) ~[classes/:na]
	at com.example.car.carmall.Listenner.ExcelListener.invoke(ExcelListener.java:17) ~[classes/:na]
	at com.alibaba.excel.read.metadata.holder.AbstractReadHolder.notifyEndOneRow(AbstractReadHolder.java:145) ~[easyexcel-2.1.6.jar:na]
	at com.alibaba.excel.analysis.v03.XlsSaxAnalyser.endRow(XlsSaxAnalyser.java:193) ~[easyexcel-2.1.6.jar:na]
	at com.alibaba.excel.analysis.v03.XlsSaxAnalyser.processLastCellOfRow(XlsSaxAnalyser.java:183) ~[easyexcel-2.1.6.jar:na]
	at com.alibaba.excel.analysis.v03.XlsSaxAnalyser.processRecord(XlsSaxAnalyser.java:172) ~[easyexcel-2.1.6.jar:na]
	at org.apache.poi.hssf.eventusermodel.MissingRecordAwareHSSFListener.processRecord(MissingRecordAwareHSSFListener.java:158) ~[poi-3.17.jar:3.17]
	at org.apache.poi.hssf.eventusermodel.FormatTrackingHSSFListener.processRecord(FormatTrackingHSSFListener.java:92) ~[poi-3.17.jar:3.17]
	at org.apache.poi.hssf.eventusermodel.HSSFRequest.processRecord(HSSFRequest.java:109) ~[poi-3.17.jar:3.17]
	at org.apache.poi.hssf.eventusermodel.HSSFEventFactory.genericProcessEvents(HSSFEventFactory.java:179) ~[poi-3.17.jar:3.17]
	at org.apache.poi.hssf.eventusermodel.HSSFEventFactory.processEvents(HSSFEventFactory.java:136) ~[poi-3.17.jar:3.17]
	at org.apache.poi.hssf.eventusermodel.HSSFEventFactory.processWorkbookEvents(HSSFEventFactory.java:82) ~[poi-3.17.jar:3.17]
	at org.apache.poi.hssf.eventusermodel.HSSFEventFactory.processWorkbookEvents(HSSFEventFactory.java:54) ~[poi-3.17.jar:3.17]
	at com.alibaba.excel.analysis.v03.XlsSaxAnalyser.execute(XlsSaxAnalyser.java:112) ~[easyexcel-2.1.6.jar:na]
	at com.alibaba.excel.analysis.ExcelAnalyserImpl.analysis(ExcelAnalyserImpl.java:105) ~[easyexcel-2.1.6.jar:na]
	at com.alibaba.excel.ExcelReader.read(ExcelReader.java:180) ~[easyexcel-2.1.6.jar:na]
	at com.alibaba.excel.ExcelReader.read(ExcelReader.java:170) ~[easyexcel-2.1.6.jar:na]
	at com.example.car.carmall.controller.ExcelController.importExcel(ExcelController.java:159) ~[classes/:na]
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_91]
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_91]
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_91]
	at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_91]
	at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:190) ~[spring-web-5.1.9.RELEASE.jar:5.1.9.RELEASE]
	at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:138) ~[spring-web-5.1.9.RELEASE.jar:5.1.9.RELEASE]
	at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:104) ~[spring-webmvc-5.1.9.RELEASE.jar:5.1.9.RELEASE]
	at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:892) ~[spring-webmvc-5.1.9.RELEASE.jar:5.1.9.RELEASE]
	at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:797) ~[spring-webmvc-5.1.9.RELEASE.jar:5.1.9.RELEASE]
	at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) ~[spring-webmvc-5.1.9.RELEASE.jar:5.1.9.RELEASE]
	at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1039) ~[spring-webmvc-5.1.9.RELEASE.jar:5.1.9.RELEASE]
	at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:942) ~[spring-webmvc-5.1.9.RELEASE.jar:5.1.9.RELEASE]
	at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1005) ~[spring-webmvc-5.1.9.RELEASE.jar:5.1.9.RELEASE]
	at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:908) ~[spring-webmvc-5.1.9.RELEASE.jar:5.1.9.RELEASE]
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:660) ~[tomcat-embed-core-9.0.22.jar:9.0.22]
	at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:882) ~[spring-webmvc-5.1.9.RELEASE.jar:5.1.9.RELEASE]
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:741) ~[tomcat-embed-core-9.0.22.jar:9.0.22]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) ~[tomcat-embed-core-9.0.22.jar:9.0.22]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.22.jar:9.0.22]
	at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) ~[tomcat-embed-websocket-9.0.22.jar:9.0.22]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.22.jar:9.0.22]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.22.jar:9.0.22]
	at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:99) ~[spring-web-5.1.9.RELEASE.jar:5.1.9.RELEASE]
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:118) ~[spring-web-5.1.9.RELEASE.jar:5.1.9.RELEASE]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.22.jar:9.0.22]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.22.jar:9.0.22]
	at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:92) ~[spring-web-5.1.9.RELEASE.jar:5.1.9.RELEASE]
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:118) ~[spring-web-5.1.9.RELEASE.jar:5.1.9.RELEASE]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.22.jar:9.0.22]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.22.jar:9.0.22]
	at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:93) ~[spring-web-5.1.9.RELEASE.jar:5.1.9.RELEASE]
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:118) ~[spring-web-5.1.9.RELEASE.jar:5.1.9.RELEASE]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.22.jar:9.0.22]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.22.jar:9.0.22]
	at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:200) ~[spring-web-5.1.9.RELEASE.jar:5.1.9.RELEASE]
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:118) ~[spring-web-5.1.9.RELEASE.jar:5.1.9.RELEASE]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.22.jar:9.0.22]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.22.jar:9.0.22]
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202) ~[tomcat-embed-core-9.0.22.jar:9.0.22]
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) [tomcat-embed-core-9.0.22.jar:9.0.22]
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:490) [tomcat-embed-core-9.0.22.jar:9.0.22]
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139) [tomcat-embed-core-9.0.22.jar:9.0.22]
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) [tomcat-embed-core-9.0.22.jar:9.0.22]
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) [tomcat-embed-core-9.0.22.jar:9.0.22]
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) [tomcat-embed-core-9.0.22.jar:9.0.22]
	at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:408) [tomcat-embed-core-9.0.22.jar:9.0.22]
	at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66) [tomcat-embed-core-9.0.22.jar:9.0.22]
	at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:853) [tomcat-embed-core-9.0.22.jar:9.0.22]
	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1587) [tomcat-embed-core-9.0.22.jar:9.0.22]
	at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) [tomcat-embed-core-9.0.22.jar:9.0.22]
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [na:1.8.0_91]
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [na:1.8.0_91]
	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat-embed-core-9.0.22.jar:9.0.22]
	at java.lang.Thread.run(Thread.java:745) [na:1.8.0_91]


打断点发现 注入的mapper 为空,所以报错

经过分析得:监听器中不能使用spring注入,所以报错,在网上找到其中一种解决办法使用set 形式 注入mapper,如下:

在控制器中使用监听的地方将mapper代入,如下:

 /** * easyExcel导入方式 * @return */
    @PostMapping("/importExcel")
    public R<?> importExcel(){ 
        //导入需要添加一个监听
        //1. 获取导入文件的路径
        String path = "C:\\Users\\YKT\\Desktop\\临时\\car.xls";
        //创建读入的excel的构造器 告诉其文件位置,要读那个java对象 以及读取监听器
        //读取之后 在监听器中插入数据库
        // new ExcelListener(excelMapper) ***将 mapper 带入 ***
        ExcelReader build = EasyExcel.read(path,Excel.class,new ExcelListener(excelMapper)).build();
        // 0 表示只导入第一个sheet表中的数据
        ReadSheet readSheet = EasyExcel.readSheet(0).build();
        build.read(readSheet);
        build.finish();

        return R.ok("导入成功!");
    }

监听器

在监听器中引入 接口
 /** * 引入接口 */
     ExcelMapper mapper;

通过构造函数从外部传入接口

 /** * 我们通过构造函数从外部传入接口 * @param mapper */
    public ExcelListener(ExcelMapper mapper){ 
        this.mapper = mapper;
    }

完整代码 如下:

package com.example.car.carmall.Listenner;

import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.example.car.carmall.domain.Excel;
import com.example.car.carmall.mapper.ExcelMapper;

import java.text.SimpleDateFormat;
import java.util.Date;

/** * @author wcb 导入excel 监听器 * 创建读取监听器类 继承 AnalysisEventListener类 并将其要读取成的java对象传入泛型 * @date 2022 年 01月 13 日 11:42 */
public class ExcelListener extends AnalysisEventListener<Excel> { 

    /** * 引入接口 */
     ExcelMapper mapper;
    /** * 我们通过构造函数从外部传入接口 * @param mapper */
    public ExcelListener(ExcelMapper mapper){ 
        this.mapper = mapper;
    }

    /** * 逐行读取 读取之后 在监听器中插入数据库 * @param excel * @param analysisContext */
    @Override
    public void invoke(Excel excel, AnalysisContext analysisContext) { 
        SimpleDateFormat dfs = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
        System.out.println(dfs.format(new Date()) +" ====== "+excel);
        //加入数据库
        mapper.insertIntoExcel(excel);
    }

    /** * 读取完毕触发执行 * @param analysisContext */
    @Override
    public void doAfterAllAnalysed(AnalysisContext analysisContext) { 
        System.out.println("finish");
    }
}

以上方法可以解决报错,这是多种方式中的一种,其他的解决方式正在研究,如果各位有其他方法也请指教

免责声明
本站部分资源来源于互联网 如有侵权 请联系站长删除
龙哥网是优质的互联网科技创业资源_行业项目分享_网络知识引流变现方法的平台为广大网友提供学习互联网相关知识_内容变现的方法。