之前有同学来问Excel的读取导出,那会还不知道easyExcel这玩意.只是自己封装了POI的API整了个工具类.今天试了下easyExcel人门 demo,发现easyExcel不错,在此总结一下.pom依赖:
一,Excel文件读取:
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>2.1.6</version>
</dependency>
1,自己实现一个读取的监听器,实现抽象类AnalysisEventListener<T>,监听器不使用spring管理,而是每次new对象.
a,监听器的invoke()方法每读取一行会调用一次;
b,监听器的doAfterAllAnalysed()读取完后会调用,仅仅一次.
2,一个实体类:与excel表每一列对应的实体类.
监听器代码:(确保指定的文件有demo.xlsx文件)
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import java.util.ArrayList;
import java.util.List;
// 有个很重要的点 DemoDataListener 不能被spring管理,要每次读取excel都要new,然后里面用到spring可以构造方法传进去
public class DemoDataListener extends AnalysisEventListener<DemoData> {
//每隔5条存储数据库,实际使用中可以3000条,然后清理list ,方便内存回收
private static final int BATCH_COUNT = 5;
List<DemoData> list = new ArrayList<DemoData>();
//假设这个是一个DAO,当然有业务逻辑这个也可以是一个service。或者你其他功能的Service来处理读取的数据。
private DemoDAO demoDAO;
public DemoDataListener() {
// 这里是demo,所以随便new一个。实际使用如果到了spring,请使用下面的有参构造函数
demoDAO = new DemoDAO();
}
/**
* 如果使用了spring,请使用这个构造方法。每次创建Listener的时候需要把spring管理的类传进来
*/
public DemoDataListener(DemoDAO demoDAO) {
this.demoDAO = demoDAO;
}
// * 这个每一条数据解析都会来调用
@Override
public void invoke(DemoData data, AnalysisContext context) {
System.out.println("解析到一条数据:" + data.toString());
list.add(data);
// 达到BATCH_COUNT了,需要去存储一次数据库,防止数据几万条数据在内存,容易OOM
if (list.size() >= BATCH_COUNT) {
saveData();
System.out.println("分批存入数据:" + list.size());
// 存储完成清理 list
list.clear();
}
}
// 所有数据解析完成了 都会来调用
@Override
public void doAfterAllAnalysed(AnalysisContext context) {
// 这里也要保存数据,确保最后遗留的数据也存储到数据库
saveData();
System.out.println("所有数据解析完成后调用doAfterAllAnalysed:" + list.size());
}
// 假设业务就是存入数据库
private void saveData() {
demoDAO.save(list);
System.out.println("存储数据库成功");
}
public static void main(String[] args) {
String fileName = TestFileUtil.getPath() + "demo.xlsx";
//如果报错.查看这个路径是否有文件,放一个上去
System.out.println("在这个文件夹上放个demo.xlsx:" + fileName);
// 这里 需要指定读用哪个class去读,然后读取第一个sheet 文件流会自动关闭
EasyExcel.read(fileName, DemoData.class, new DemoDataListener()).sheet().doRead();
}
//为了方便运行,使用了内部类
class DemoDAO {
public void save(List<DemoData> list) {
// 如果是mybatis,尽量别直接调用多次insert,自己写一个mapper里面新增一个方法batchInsert,所有数据一次性插入
}
}
public static String getPath() {
return DemoDataListener.class.getResource("/").getPath();
}
}
实体类:
public class DemoData {
//get set 方法自己加上
private String string;
private Date date;
private Double doubleData;
}
demo.xlsx

真心超简单,超好用.easy不是能随便叫的.(导出的后面发)
更多功能可以访问:https://www.yuque.com/easyexcel/doc/easyexcel
#欢迎关注-- ☆或许能帮你解决JAVA问题☆.

本文介绍了如何使用easyExcel库来读取Excel文件,通过创建监听器和实体类,简单几步即可实现高效便捷的读取操作。监听器的invoke方法会在读取每一行时被调用,doAfterAllAnalysed方法则在读取完成后执行。示例代码展示了具体的实现过程,证明easyExcel的易用性和实用性。

255

被折叠的 条评论
为什么被折叠?



