前情
今天碰到个需要要做excel导入数据,用POI实在是太心累了,之前临时用过easyExcel,也没太用明白,今天好好看了一下,稍稍整理一下。
官方介绍
EasyExcel是一个基于Java的简单、省内存的读写Excel的开源项目。在尽可能节约内存的情况下支持读写百M的Excel。 github地址:https://github.com/alibaba/easyexcel
文档地址:官方文档
引入依赖
官方文档里面写依赖。。。我还是自己去maven仓库搜索来的。。。
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>2.2.7</version>
</dependency>
定义实体类
我是用的定义实体类的方法来实现的,官方文档里面也写了没有实例类对应的情况,我这边就用有实体类对应的方法来实现的。
/**
* @Classname TestEntity
* @Description TODO
* @Date 2021/9/10 10:43
* @Created by frank
*/
@Data
public class TestEntity {
@ExcelProperty(index = 0)// index代表第几列,可以用列号匹配,也可以用列名(name)匹配
private String type;//分类
@ExcelProperty(index = 1)// index代表第几列,可以用列号匹配,也可以用列名(name)匹配
private Integer weight;//权重
@ExcelProperty(index = 2)// index代表第几列,可以用列号匹配,也可以用列名(name)匹配
private String project;//检查考核项目
@ExcelProperty(index = 3)// index代表第几列,可以用列号匹配,也可以用列名(name)匹配
private String standard;//标准
}
定义监听器
我这边是有对应的实体类的,继承AnalysisEventListener的时候,需要申明泛型。
/**
* @Classname ExcelListListener
* @Description TODO
* @Date 2021/9/10 10:37
* @Created by frank
*/
@Slf4j
// 有个很重要的点 ExcelListListener 不能被spring管理,要每次读取excel都要new,然后里面用到spring可以构造方法传进去
public class ExcelListListener extends AnalysisEventListener<TestEntity> {
private List<TestEntity> dataList= new ArrayList<>();
// 我这边需要对读取的数据,整体进行处理,所以我就通过构造函数传进来一个数组,来接收读取到的数据
public AssessmentRulesListener(List<AssessmentRules> dataList) {
this.dataList = dataList;
}
// 假设需要用到一个DemoDAO,当然这边也是可以写service的,看你实际需要什么
private DemoDAO demoDAO;
// 在使用到监听器的时候,可以通过监听器的构造函数来把spring管理的类传进来
// public ExcelListListener(DemoDAO demoDAO) {
// this.demoDAO= demoDAO;
// }
@Override
// easyExcel是一条条读取数据的,读取一条处理一条,下面这个函数就写一些读取数据时需要做的一些处理,一些判空处理啊,数据有效性验证都可以放这边来写
public void invoke(TestEntity entity, AnalysisContext analysisContext) {
// 我这边写的比较简单,我只要读数据,那我就直接放入一个list里面了
if (entity != null) {
objectList.add(entity);
log.info("数据读取成功:" + entity.toString());
}
}
@Override
// 下面是写一些读取结束前需要做的事情,在所有数据解析完成后,都会来调用
public void doAfterAllAnalysed(AnalysisContext analysisContext) {
log.info("共有数据:" + objectList.size() + "条");
}
}
注意点:
监听器不能被spring管理,每次读取的时候需要new一下,如果需要在监听器里面用到别的service或者Dao的时候,需要在监听器的构造函数里面传进去。
写个测试
/**
* @Classname TestController
* @Description TODO
* @Date 2021/9/10 10:36
* @Created by frank
*/
@Slf4j
@RestController
@RequestMapping("/test")
public class TestController {
@RequestMapping("/read")
public void readTest(@RequestParam MultipartFile file) {
ExcelReader excelReader = null;
try {
//把前端传来的文件转成输入流
InputStream inputStream = file.getInputStream();
// 初始化对象
excelReader = EasyExcel.read(inputStream, TestEntity.class, new ExcelListListener()).build();
// 指定读取哪一个sheet
ReadSheet readSheet = EasyExcel.readSheet(0).build();
// 开始读取
excelReader.read(readSheet);
} catch (IOException e) {
log.error("文件错误!");
} finally {
if (excelReader != null) {
// 这里千万别忘记关闭,读的时候会创建临时文件,到时磁盘会崩的
excelReader.finish();
}
}
}
}
测试一下
OK了!非常简单!用的时候也百度了很多easyExcel的使用的博客,人家那边还有很厉害的工具类,我先慢慢啃一下,啃完了我再来更新~~