Easyexcel简介及写、读操作
- 一、背景
- 二、简介
- 三、引入依赖
- 四、代码实现
- 1.创建实体类
- 2.写入excel操作
- 3.读取文件操作
- 3.1 指定excel对应索引
- 3.2 设置监听器
- 3.3 执行读取操作
一、背景
作为一个经常进行数据分析的后端人员,免不了面对各种报表,且在日常的工作中,经常需要处理大量的数据,并进行各种复杂的计算和分析。而Excel作为一个重要的工具,在数据处理与分析上也起到了至关重要的作用。但是,Excel的操作繁琐、效率低下等问题也制约着我们的工作效率。为了解决这个问题,我们可以使用EasyExcel这个优秀的Java类库,来优化Excel数据的读写,并提高我们的工作效率。
二、简介
- Java领域解析、生成Excel比较有名的框架有Apache poi、jxl等。但他们都存在一个严重的问题就是非常的耗内存。如果你的系统并发量不大的话可能还行,但是一旦并发上来后一定会OOM或者JVM频繁的full gc。
- EasyExcel是阿里巴巴开源的一个excel处理框架,以使用简单、节省内存著称。EasyExcel能大大减少占用内存的主要原因是在解析Excel时没有将文件数据一次性全部加载到内存中,而是从磁盘上一行行读取数据,逐个解析。
- EasyExcel采用一行一行的解析模式,并将一行的解析结果以观察者的模式通知处理(AnalysisEventListener)
官方网站: https://easyexcel.opensource.alibaba.com
github地址: https://github.com/alibaba/easyexcel
gitee地址: https://gitee.com/easyexcel/easyexcel
三、引入依赖
<!-- xls格式excel依赖包 -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.17</version>
</dependency>
<!--xlsx格式excel依赖包-->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.17</version>
</dependency>
<!-- easyexcel依赖包 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>2.1.1</version>
</dependency>
四、代码实现
1.创建实体类
这个实体类的属性内容要与excel的表头字段进行绑定,可以在属性上添加@ExcelProperty指定相应的表头的内容。
public class UserData {
@ExcelProperty("用户id")
private Integer uid;
@ExcelProperty("用户名")
private String userName;
@ExcelProperty("性别")
private String sex;
@ExcelProperty("年龄")
private Integer age;
public Integer getUid() {
return uid;
}
public void setUid(Integer uid) {
this.uid = uid;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}
2.写入excel操作
public class ExcelWriteDemo {
public static void main(String[] args) {
List<UserData> list = new ArrayList<>();
for(int i = 0;i<100;i++){
UserData userData = new UserData();
userData.setUid(i);
userData.setUserName("excelwriteTest"+i);
userData.setSex("男");
userData.setAge(20+i);
list.add(userData);
}
String fileName = "D:\\excelTest\\20230729.xls";
EasyExcel.write(fileName,UserData.class).sheet("用户信息").doWrite(list);
}
}
执行后文件如下:
11:58:22.004 [main] DEBUG com.alibaba.excel.context.WriteContextImpl - Begin to Initialization 'WriteContextImpl'
11:58:22.037 [main] DEBUG com.alibaba.excel.metadata.property.ExcelHeadProperty - The initialization sheet/table 'ExcelHeadProperty' is complete , head kind is CLASS
11:58:22.113 [main] DEBUG com.alibaba.excel.context.WriteContextImpl - CurrentConfiguration is writeWorkbookHolder
11:58:22.433 [main] DEBUG com.alibaba.excel.context.WriteContextImpl - Initialization 'WriteContextImpl' complete
11:58:22.434 [main] DEBUG com.alibaba.excel.context.WriteContextImpl - Sheet number is null
11:58:22.435 [main] DEBUG com.alibaba.excel.metadata.property.ExcelHeadProperty - The initialization sheet/table 'ExcelHeadProperty' is complete , head kind is CLASS
11:58:22.435 [main] DEBUG com.alibaba.excel.context.WriteContextImpl - CurrentConfiguration is writeSheetHolder
11:58:22.436 [main] DEBUG com.alibaba.excel.context.WriteContextImpl - Can not find sheet:0 ,now create it
11:58:22.854 [main] DEBUG com.alibaba.excel.context.WriteContextImpl - Finished write.
3.读取文件操作
3.1 指定excel对应索引
对于excel的读操作,需要修改下注解,指定该属性对应在excel中的哪一列的索引。
public class UserData {
@ExcelProperty(value = "用户id",index = 0)
private Integer uid;
@ExcelProperty(value = "用户名",index = 1)
private String userName;
@ExcelProperty(value = "性别",index = 2)
private String sex;
@ExcelProperty(value = "年龄",index = 3)
private Integer age;
public Integer getUid() {
return uid;
}
public void setUid(Integer uid) {
this.uid = uid;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}
3.2 设置监听器
读操作需要设置一个监听器,目的就是能够一行一行的去读取文件中的数据。
public class ExcelLisenner extends AnalysisEventListener<UserData> {
// 一行一行的读取内容,从第二行开始
@Override
public void invoke(UserData userData, AnalysisContext analysisContext) {
System.out.println(userData.toString());
System.out.println("读取一行,执行操作");
}
// 读取之后执行的操作
@Override
public void doAfterAllAnalysed(AnalysisContext analysisContext) {
System.out.println("读取之后执行的操作");
}
// 读取第一行表头信息
@Override
public void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) {
System.out.println("表头信息:" + headMap);
}
}
3.3 执行读取操作
public class ExcelReadDemo {
public static void main(String[] args) {
String fileName = "D:\\excelTest\\20230729.xls";
EasyExcel.read(fileName,UserData.class,new ExcelLisenner()).sheet().doRead();
}
}
执行结果如下:
表头信息:{0=用户id, 1=用户名, 2=性别, 3=年龄}
UserData{uid=0, userName='excelwriteTest0', sex='男', age=20}
读取一行,执行操作
UserData{uid=1, userName='excelwriteTest1', sex='男', age=21}
读取一行,执行操作
UserData{uid=2, userName='excelwriteTest2', sex='男', age=22}
读取一行,执行操作
UserData{uid=3, userName='excelwriteTest3', sex='男', age=23}
读取一行,执行操作
UserData{uid=4, userName='excelwriteTest4', sex='男', age=24}
读取一行,执行操作
UserData{uid=5, userName='excelwriteTest5', sex='男', age=25}
读取一行,执行操作
UserData{uid=6, userName='excelwriteTest6', sex='男', age=26}
读取一行,执行操作
UserData{uid=7, userName='excelwriteTest7', sex='男', age=27}
读取一行,执行操作
UserData{uid=8, userName='excelwriteTest8', sex='男', age=28}
读取一行,执行操作
UserData{uid=9, userName='excelwriteTest9', sex='男', age=29}
读取一行,执行操作
UserData{uid=10, userName='excelwriteTest10', sex='男', age=30}
读取一行,执行操作
UserData{uid=11, userName='excelwriteTest11', sex='男', age=31}
读取一行,执行操作
UserData{uid=12, userName='excelwriteTest12', sex='男', age=32}
读取一行,执行操作
UserData{uid=13, userName='excelwriteTest13', sex='男', age=33}
读取一行,执行操作
UserData{uid=14, userName='excelwriteTest14', sex='男', age=34}
读取一行,执行操作
UserData{uid=15, userName='excelwriteTest15', sex='男', age=35}
读取一行,执行操作
UserData{uid=16, userName='excelwriteTest16', sex='男', age=36}
读取一行,执行操作
UserData{uid=17, userName='excelwriteTest17', sex='男', age=37}
读取一行,执行操作
UserData{uid=18, userName='excelwriteTest18', sex='男', age=38}
读取一行,执行操作
UserData{uid=19, userName='excelwriteTest19', sex='男', age=39}
读取一行,执行操作
UserData{uid=20, userName='excelwriteTest20', sex='男', age=40}
读取一行,执行操作
读取之后执行的操作