一、简介
1.前言
- 在实际的业务系统开发过程中,操作 Excel 实现数据的导入导出基本上是个非常常见的需求。
- 除了本文要介绍的easyexcel还有EasyPoi,但是有人提出在数据量大的情况下,EasyPoi 会占用内存大,性能不够好,严重的时候,还会出现内存异常的现象。
- 今天我给大家推荐一款性能更好的 Excel 导入导出工具:
EasyExcel
,希望对大家有所帮助!
2.介绍
- easyexcel 是阿里开源的一款 Excel导入导出工具,具有处理速度快、占用内存小、使用方便的特点,底层逻辑也是基于 apache poi 进行二次开发的,目前的应用也是非常广!GitHub地址👉👉easyexcel
- 相比 EasyPoi,EasyExcel 的处理数据性能非常高,读取 75M (46W行25列) 的Excel,仅需使用 64M 内存,耗时 20s,极速模式还可以更快!
二、实践
1.准备
- 在 SpringBoot 项目中集成 EasyExcel 其实非常简单,仅需一个依赖即可。
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>3.0.5</version>
</dependency>
2.EasyExcel 的导出导入支持两种方式进行处理
- 第一种是通过实体类注解方式来生成文件和反解析文件数据映射成对象
- 第二种是通过动态参数化生成文件和反解析文件数据
下面我们以用户信息的导出导入为例,分别介绍两种处理方式。
3.简单导出
1.首先,我们只需要创建一个UserEntity用户实体类,然后添加对应的注解字段即可,示例代码如下:
@Data
@NoArgsConstructor
public class UserWriteEntity {
@ExcelProperty(value = "姓名")
private String name;
@ExcelProperty(value = "年龄")
private int age;
@DateTimeFormat("yyyy-MM-dd HH:mm:ss")
@ExcelProperty(value = "操作时间")
private Date time;
public UserWriteEntity(String name, int age, Date time) {
this.name = name;
this.age = age;
this.time = time;
}
}
2.然后,使用 EasyExcel 提供的EasyExcel工具类,即可实现文件的导出。
List<UserWriteEntity> list = new ArrayList<>();
//创建多条数据放入list中
for(int i=0;i<=100000;i++){
UserWriteEntity user=new UserWriteEntity("张三"+i,20+i,new Date(System.currentTimeMillis()));
list.add(user);
}
//定义文件输出位置
FileOutputStream outputStream= null;
try {
//指定文件输出地址
outputStream = new FileOutputStream(new File("C:\\Users\\JWK.LAPTOP-HV8DSCMN\\Desktop\\user.xlsx"));
} catch (FileNotFoundException e) {
e.printStackTrace();
}
/**
* UserWriteEntity.class 需要指定写用哪个class去写
* .sheet("") 设置表名字
* .doWrite() 关闭流
*/
EasyExcel.write(outputStream,UserWriteEntity.class).sheet("用户信息").doWrite(list);
运行程序,打开文件内容结果!
3.简单导入
这种简单固定表头的 Excel 文件,如果想要读取文件数据,操作也很简单。
//同步读取文件内容
FileInputStream inputStream = null;
try {
//指定Excel文件地址
inputStream = new FileInputStream(new File("C:\\Users\\JWK.LAPTOP-HV8DSCMN\\Desktop\\user.xlsx"));
} catch (FileNotFoundException e) {
e.printStackTrace();
}
/**
* UserWriteEntity.class 指定读以哪个类的属性格式去读
* .doReadSync() 作用同样是关闭流
*/
list = EasyExcel.read(inputStream).head(UserWriteEntity.class).sheet().doReadSync();
//可将结果转换成JSON格式输出查看
System.out.println(JSONArray.toJSONString(list));
//遍历查看结果
for (int i=0;i<=10;i++){
System.out.println(list.get(i).getName()+list.get(i).getAge()+list.get(i).getTime());
}
运行程序,输出结果如下:
三、总结
- 当然,EasyExcel 的功能还不只上面介绍的那些内容,还有基于模版进行 excel的填充,web 端 restful 的导出导出,使用方法大致都差不多。