这是我参与8月更文挑战的第26天,活动详情查看:8月更文挑战
前言
传统Excel操作或者解析都是利用Apach POI
进行操作,但是使用过这个框架的人都知道,这个框架并不完美,有较多的缺陷:
- 使用步骤繁琐
- 动态写出Excel操作非常麻烦
- 对于新手来说,很难在短时间内上手
- 读写时需要占用较大的内容,当数据量大时容器发生
OOM
基于上述原因,阿里开源出一款易上手,且比较节省内存的Excel
操作框架:EasyExcel
对比
从上图可知:
-
当利用
POI
去读取Excel
时,首先会将数据全部加载到内存中,然后返回给调用者;当数据量比较大时,及其容易发生OOM
。 -
与
POI
不用的是,EasyExcel
主要是采用sax模式一行一行解析,并将一行的解析结果以观察者的模式通知处理,即使数据量较大时也不会发生OOM
。
以下是EasyExcel
读取数据原理图:
下面就来演示一下官网的例子,具体的可以去看官网,链接地址:www.yuque.com/easyexcel/d…
写excel
添加依赖包
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>2.2.6</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.12</version>
</dependency>
复制代码
对象创建
package excel;
import com.alibaba.excel.annotation.ExcelIgnore;
import com.alibaba.excel.annotation.ExcelProperty;
import lombok.Data;
import java.util.Date;
@Data
public class DemoData {
@ExcelProperty("字符串标题")
private String string;
@ExcelProperty("日期标题")
private Date date;
@ExcelProperty("数字标题")
private Double doubleData;
/**
* 忽略这个字段
*/
@ExcelIgnore
private String ignore;
}
复制代码
测试代码
package excel;
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.ExcelWriter;
import com.alibaba.excel.write.metadata.WriteSheet;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
public class Test01 {
private static List<DemoData> data() {
List<DemoData> list = new ArrayList<>();
for (int i = 0; i < 10; i++) {
DemoData data = new DemoData();
data.setString("字符串" + i);
data.setDate(new Date());
data.setDoubleData(0.56);
list.add(data);
}
return list;
}
public static void main(String[] args) {
// 写法2
String fileName = "D:\\code\\javaSE\\EasyTest.xlsx";
// 这里 需要指定写用哪个class去写
ExcelWriter excelWriter = null;
try {
excelWriter = EasyExcel.write(fileName, DemoData.class).build();
WriteSheet writeSheet = EasyExcel.writerSheet("模板").build();
excelWriter.write(data(), writeSheet);
} finally {
// 千万别忘记finish 会帮忙关闭流
if (excelWriter != null) {
excelWriter.finish();
}
}
}
}
复制代码
运行程序,打开文件结果:
读excel
对象创建
package excel;
import lombok.Data;
import java.util.Date;
@Data
public class DemoData02 {
private String string;
private Date date;
private Double doubleData;
}
复制代码
测试代码
package excel;
import com.alibaba.excel.EasyExcel;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.util.List;
public class Test02 {
public static void main(String[] args) throws FileNotFoundException {
//同步读取文件内容
FileInputStream inputStream = new FileInputStream(new File("D:\\code\\javaSE\\EasyTest.xlsx"));
List<DemoData02> list = EasyExcel.read(inputStream).head(DemoData02.class).sheet().doReadSync();
list.forEach(System.out::println);
}
}
复制代码
输出结果:
DemoData02(string=字符串0, date=Thu Aug 26 18:02:48 CST 2021, doubleData=0.56)
DemoData02(string=字符串1, date=Thu Aug 26 18:02:48 CST 2021, doubleData=0.56)
DemoData02(string=字符串2, date=Thu Aug 26 18:02:48 CST 2021, doubleData=0.56)
DemoData02(string=字符串3, date=Thu Aug 26 18:02:48 CST 2021, doubleData=0.56)
DemoData02(string=字符串4, date=Thu Aug 26 18:02:48 CST 2021, doubleData=0.56)
DemoData02(string=字符串5, date=Thu Aug 26 18:02:48 CST 2021, doubleData=0.56)
DemoData02(string=字符串6, date=Thu Aug 26 18:02:48 CST 2021, doubleData=0.56)
DemoData02(string=字符串7, date=Thu Aug 26 18:02:48 CST 2021, doubleData=0.56)
DemoData02(string=字符串8, date=Thu Aug 26 18:02:48 CST 2021, doubleData=0.56)
DemoData02(string=字符串9, date=Thu Aug 26 18:02:48 CST 2021, doubleData=0.56)
复制代码
总结
这里只是简单的介绍了一下EasyExcel
的基本使用,详细介绍可以去看官方文档。养成一个好的学习习惯,多看看官方的文档。关注我,一个专注分享Java知识的新时代农民工。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END