简单的导入Excel步骤
一、写实体类
@Data
@ExcelIgnoreUnannotated
@ContentRowHeight(20)
@HeadRowHeight(20)
@ColumnWidth(25)
public class Student {
@ExcelProperty("姓名")
private String name;
@ExcelProperty("年龄")
private Integer age;
}
二、写监听类
创建的监听类需要Extens AnalysisEventListener类,类中的范型是要解析的实体类。此处以Student类为例。
监听类中的Service是没法使用@Autowired注解通过Spring管理的,如果导入后要用到service,需要在构造函数的参数中传入Service。
监听类中的invoke和doAfterAllAnalysed方法分别对应解析每条数据后执行的操作,和解析完全部数据执行的操作。当读取到数据后需要对数据进行处理时,应在这两个方法中写执行语句。
@Slf4j
public class StudentImportListener extends AnalysisEventListener<Student> {
/**
* 每隔5条存储数据库,方便内存回收
*/
private static final int BATCH_COUNT = 5;
List<Student> list = new ArrayList<>();
private void showResult(){
//展示获取到的数据
System.out.println("从excel中获取到的数据:");
for (Student student : list) {
System.out.println("student = " + student);
}
}
//无参构造方法
public StudentImportListener() {
}
/**
* 这个每一条数据解析都会来调用
*/
@Override
public void invoke(Student student, AnalysisContext analysisContext) {
log.info("解析到一条数据:{}",student);
list.add(student);
// 达到BATCH_COUNT了,需要去存储一次数据库,防止数据几万条数据在内存,容易OOM
if (list.size() >= BATCH_COUNT) {
showResult();
// 存储完成清理list
list.clear();
}
}
/**
* 所有数据解析完成了 都会来调用
*/
@Override
public void doAfterAllAnalysed(AnalysisContext analysisContext) {
showResult();
System.out.println("所有数据解析完成!");
}
}
三、写导入方法
获取要读取的文件的位置
执行EasyExcel的read方法,其中,第一个参数是文件的路径,第二个参数是要解析的实体类(此处为我们创建的Student类),第三个参数是刚才创建的监听器类。
/**
* 导入Execl
*/
@Test
public void importExcelTest(){
// 1.获得要读取的文件的位置
String path = "src/main/resources/excel/";
String fileName = "importExample.xlsx";
String name = path + fileName;
// 2.读文件
EasyExcel.read(name,Student.class,
new StudentImportListener()).sheet().doRead();
}