原代码如下
控制器中
/** * 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");
}
}
以上方法可以解决报错,这是多种方式中的一种,其他的解决方式正在研究,如果各位有其他方法也请指教
免责声明
本站部分资源来源于互联网 如有侵权 请联系站长删除
龙哥网是优质的互联网科技创业资源_行业项目分享_网络知识引流变现方法的平台为广大网友提供学习互联网相关知识_内容变现的方法。