解决EasyExcel对表格的读报错空指针异常
前言:最近我们老大叫我们学习对Excel的导入和导出,我就着手开始研究如何实现效果了,故此我开始学习了 EasyExcel
突然遇到BUG了
出现一个空指针异常;
我返回官方文档 看到这个
也就是说在监听器中我们不能使用spring的注入
我再次进入官方的github中Issues
所以我就想到了通过set的形式注入Mapper
Student
@AllArgsConstructor
@NoArgsConstructor
@Data
@TableName("student")
public class Student {
/**
* 学生姓名
*/
@ColumnWidth(value = 20)
@ExcelProperty(value = {"学生姓名"},index = 0)
private String name;
/**
* 学生性别
*/
@ColumnWidth(value = 20)
@ExcelProperty(value = {"学生性别"},index = 1)
private String gender;
/**
* 学生生日
*/
@ColumnWidth(value = 20)
@ExcelProperty(value = {"学生生日"},index = 2)
private String birthday;
/**
* 学生id号
*/
@ExcelProperty(value = {"学生id"},index = 3)
@ColumnWidth(value = 20)
private String id;
}
DemoDataListener
/**
* @author kils
*/
public class DemoDataListener extends AnalysisEventListener<Student> {
/**
* 引入接口
*/
SelectAll selectAll;
/**
* 我们通过构造函数从外部传入接口
* @param selectAll
*/
public DemoDataListener(SelectAll selectAll){
this.selectAll = selectAll;
}
/**
* When analysis one row trigger invoke function.
* 分析时,一行触发调用函数。
* @param data
* @param context
*/
@Override
public void invoke(Student data, AnalysisContext context) {
selectAll.insertStudent(data);
System.out.println(data);
}
/**
*
* @param context
*/
@Override
public void doAfterAllAnalysed(AnalysisContext context) {
}
}
SelectAll
/**
* @author kils
*/
@Mapper
public interface SelectAll {
/**
* @param student
* @return
*/
Boolean insertStudent(Student student);
}
SelectAll.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.capgmini.kils.EasyExcel.mapper.SelectAll">
<insert id="insertStudent" parameterType="com.capgmini.kils.EasyExcel.entery.Student" >
insert into student values(#{name},#{gender},#{birthday},#{id});
</insert>
</mapper>
接下来可以测试通过了
最后补充一下(来自简书的“码农_夏挚”博主的文章)
在使用EasyExcel中的读取excel时,需要使用到监听器,但是在Listener监听器中无法使用Spring容器的@Resource或者@Autowired 注解的方法注入bean,因为,在web Server容器中,无论是Servlet,Filter,还是Listener都不是Spring容器管理的,因此我们都无法在这些类中直接使用Spring注解的方式来注入我们需要的对象。在这里,Servlet的整个生命周期都是由Servlet容器来处理的。如果把它硬放到Spring容器中去创建,Servlet对象是可被Spring容器建出来,但Servlet容器可能跟本就不知道这个Servlet是否存在,因为不在它自己的容器中。所以,servlet交给web server来管理,不要交给spring管理。