EasyExcel是一个基于Java的简单、省内存的读写Excel的开源项目。在尽可能节约内存的情况下支持读写百M的Excel。
官网:https://www.yuque.com/easyexcel
github地址:https://github.com/alibaba/easyexcel
1、导入依赖
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>3.0.5</version>
</dependency>
2、接口文档
Request URL: /clues/clue/importData
Request Method: POS
{
"msg": "操作成功",
"code": 200,
"data": {
"successNum": 1,
"failureNum": 0
}
}
3、结果集对象
/**
* 线索导入结果集对象
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class ImportResultDTO {
//成功数量
private Integer successNum = 0;
//失败数量
private Integer failureNum = 0;
/**
* 提供静态方法,发生插入失败的时候记录
*/
public static ImportResultDTO error() {
return new ImportResultDTO(0, 1);
}
/**
* 提供静态方法,发生成功的时候记录数据
*/
public static ImportResultDTO success() {
return new ImportResultDTO(1, 0);
}
/**
* 该方法主要是将每次插入的结果与总的结果进行汇总时进行调用
*/
public void addAll(ImportResultDTO data) {
this.failureNum += data.getFailureNum();
this.successNum += data.getSuccessNum();
}
}
4、Controller层
@PostMapping("/importData")
public AjaxResult importData(MultipartFile file) throws Exception {
//ExcelListener 不能被spring管理,要每次读取excel都要new, 然后里面用到spring 的对象可以构造方法传进去
//TbClueExcelVo是实体类
ExcelListener excelListener = new ExcelListener(tbClueService);
EasyExcel.read(file.getInputStream(), TbClueExcelVo.class,excelListener).sheet().doRead();
return AjaxResult.success(excelListener.getResult());
}
5、监听器
/**
* EasyExcel监听器,用于解析数据并执行操作
*/
public class ExcelListener extends AnalysisEventListener<TbClueExcelVo> {
public ITbClueService clueService;
private final ImportResultDTO resultDTO = new ImportResultDTO();
/**
* 提供带参构造方法,在这里需要通过构造方法的方式获取对应的service层
* 谁调用这个监听器谁提供需要的service
*/
public ExcelListener(ITbClueService clueService) {
this.clueService = clueService;
}
/**
* 每解析一行数据都要执行一次
* 每条都执行一次插入操作
*/
@Override
public void invoke(TbClueExcelVo data, AnalysisContext context) {
//1. 调用添加线索的业务逻辑
ImportResultDTO addResult = clueService.importCluesData(data);
//2. 统计的处理结果(成功,失败多少条,用于前端页面的提示)
resultDTO.addAll(addResult);
}
/**
* 当所有数据都解析完成后会执行
*/
@Override
public void doAfterAllAnalysed(AnalysisContext context) {
}
/**
* 返回结果集对象
*/
public ImportResultDTO getResult() {
return resultDTO;
}
}
6、Service层
@Override
public ImportResultDTO importCluesData(TbClueExcelVo data) {
//这里写单条数据的处理代码,返回成功或失败
//监听器每解析一行数据都要执行一次
return ImportResultDTO.success();
}