官网: https://easyexcel.opensource.alibaba.com/
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-M9DR8uSj-1658993899816)(C:UsersAdministratorAppDataRoamingTyporatypora-user-images1658917061315.png)]
什么是EasyExcelEasyExcel是一个基于Java的简单、省内存的读写Excel的开源项目。在尽可能节约内存的情况下支持读写百M的Excel。
EasyExcel的作用简单来说就是既实现把excel的中的数据批量添加(写)到数据库中,也实现了把数据库中的数据导入(读)到excel中
EasyExcel的应用场景我们通常可以看到很多应用程序有导出功能就是把查询到的数据导出成Excel文件,方便转发查看,同时有时候需要把Excel中的数据通过页面展示出来,就要添加到数据库,便于查询,在页面动态展示出来给用户.这就是EasyExcel这门技术的应用场景
EasyExcel的快速入门写功能的实现
第一步: 创建一个maven项目导入依赖
com.alibaba easyexcel 2.2.0-beta2 org.projectlombok lombok 1.18.20
第二步:创建一个实体类
注意: 实体类中的属性和excel中的表头的字段类型要保持一致,并且实体类中还要包含我们要添加到数据库中的一些需要设置的属性.
@Data //lombok依赖的应用,省略一些需要重新或者生成的方法
public class DemoData {
@ExcelProperty("字符串标题") //表头的名称
private String string;
@ExcelProperty("日期标题")
private Date date;
@ExcelProperty("数字标题")
private Double doubleDate;
@ExcelIgnore //不包含在excel中的字段,读出数据后封装额外字段
private String igore; // 之后保存在数据中
}
第三步: 创建一个测试类 , 在测试类中编写一个获得数据集合的方法,模拟从数据库中读出的数据
public class EasyDemo {
//生成存放数据的方法 这个方法中定义好表中存放的数据
private List data() {
//建立集合存放表中的字段
List list = new ArrayList();
for (int i = 0; i < 10; i++) {
DemoData data = new DemoData();
data.setString("字符串" + i);
data.setDate(new Date());
data.setDoubleDate(0.56);
list.add(data);
}
return list;
}
}
第四步: 在测试类中,编写写数据的代码,其实就一行代码
String path = "E:\study\projection\easyExcel\esayexcel_demo";
@Test
public void writeSimple() {
String fileName = path + "EasyTest.xlsx";
EasyExcel.write(fileName,DemoData.class).sheet("模板").doWrite(data());
}
至此,写功能就完成了.可以执行代码,进行测试.
读功能的实现
读的话涉及到监听器,这个监听器类是读功能的核心,其中invoke方法又是监听器的核心
为了防止一下看见一大堆的代码,我第一步只是实现了把excel中的数据打印在控制台.以实现逐步理解
public class DemoDataListener extends AnalysisEventListener{ private List list = new ArrayList (); //DemoData 使用的格式 // AnalysisContext 解析器,解析上下文的 @Override public void invoke(DemoData data, AnalysisContext context) { System.out.println("输出:" + JSON.toJSONString(data)); list.add(data); } @Override public void doAfterAllAnalysed(AnalysisContext analysisContext) { // 这里也要保存数据,确保最后遗留的数据也存储到数据库 }
然后在测试类中添加方法
@Test
public void read() {
String fileName = path + "EasyTest.xlsx";
// 加上继承了AnalysisEventListener类的监听器
DemoDataListener excelListener = new DemoDataListener();
EasyExcel.read(fileName,DemoData.class, excelListener).sheet().doRead();
}
这里已经是小小完成了把excel数据在控制台的打印了,后边就是更进一步的扩展了,有前边的小步骤,理解可能就不那么困难了
// 有个很重要的点 DemoDataListener 不能被spring管理,要每次读取excel都要new,然后里面用到spring可以构造方法传进去 public class DemoDataListener implements ReadListener{ private static final int BATCH_COUNT = 100; private List cachedDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT); private DemoDAO demoDAO; public DemoDataListener() { // 这里是demo,所以随便new一个。实际使用如果到了spring,请使用下面的有参构造函数 demoDAO = new DemoDAO(); } public DemoDataListener(DemoDAO demoDAO) { this.demoDAO = demoDAO; } @Override public void invoke(DemoData data, AnalysisContext context) { //注意这里的data就是每次解析出来的一行数据,封装在我们创建的实体类中 cachedDataList.add(data); // 达到BATCH_COUNT了,需要去存储一次数据库,防止数据几万条数据在内存,容易OOM if (cachedDataList.size() >= BATCH_COUNT) { //使用方法把数据读到数据库中 saveData(); //这里方法一般都写在service层中.完成数据的添加 // 存储完成清理 list cachedDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT); } } @Override public void doAfterAllAnalysed(AnalysisContext context) { // 这里也要保存数据,确保最后遗留的数据也存储到数据库 saveData(); log.info("所有数据解析完成!"); } private void saveData() { log.info("{}条数据,开始存储数据库!", cachedDataList.size()); demoDAO.save(cachedDataList); log.info("存储数据库成功!"); } }
更多的扩展可以去官网进一步了解: https://easyexcel.opensource.alibaba.com/
初学总结.纯粹学习用,如果有不对的希望,可以有人及时指正 .>>>Thanks♪(・ω・)ノ>>>>



