EasyExcel 实现多个sheet文件导入 学习笔记
创建监听器
首先定义了一个 StudentDataListener 类,继承自AnalysisEventListener,用于处理 Excel 数据读取过程中的事件。包含以下几个方法:
invoke
读取数据:
在每次读取一行数据时被调用,将数据添加到 data 列表中。doAfterAllAnalysed
处理数据:
在所有数据读取完成后被调用,调用processData
方法处理所有数据。processData
数据处理:
用于处理所有已读取的数据,例如打印或保存到数据库。
public class StudentDataListener extends AnalysisEventListener<SysStudent> {
private List<SysStudent> data = new ArrayList<>();
@Override
public void invoke(SysStudent sysStudent, AnalysisContext analysisContext) {
data.add(sysStudent);
}
@Override
public void doAfterAllAnalysed(AnalysisContext analysisContext) {
// 处理所有数据
processData(data);
}
private void processData(List<SysStudent> data) {
// 处理数据,例如保存到数据库
System.out.println("Total records: " + data.size());
data.forEach(System.out::println);
}
public List<SysStudent> getData() {
return data;
}
}
文件导入接口
- 初始化
StudentDataListener
监听器 和 存储数据对象data
- 读取excel,并将数据写入监听器中。这里要注意,每次只能读取一个sheet,所以需要根据sheet的序号或者名字来指定。
- 获取监听器读取的数据后,可以做相应的业务逻辑处理。这里的例子是把数据存储到数据库中,也可以在监听器里直接定义相关方法 (推荐)
@PostMapping("/import")
public void importFile(@RequestParam("file") MultipartFile file) throws IOException {
StudentDataListener studentDataListener = new StudentDataListener();
List<SysStudent> data = new ArrayList<>();
for (int i = 0; i < 2; i++){
EasyExcel.read(file.getInputStream(), SysStudent.class, studentDataListener)
.sheet(i)
.doRead();
data = studentDataListener.getData();
}
sysStudentService.saveBatch(data);
}