一 Excel导入导出的应用场景
1 数据导入
减轻录入工作量
2 数据导出
统计信息归档
3 数据传输
异构系统之间数据传输
二 EasyExcel简介
1 官方网站
https://github.com/alibaba/easyexcel
快速开始:https://www.yuque.com/easyexcel/doc/easyexcel
2 EasyExcel特点
Java领域解析、生成Excel比较有名的框架有Apache poi、jxl等。但他们都存在一个严重的问题就是非常的耗内存。如果你的系统并发量不大的话可能还行,但是一旦并发上来后一定会OOM或者JVM频繁的full gc。
EasyExcel是阿里巴巴开源的一个excel处理框架,以使用简单、节省内存著称。EasyExcel能大大减少占用内存的主要原因是在解析Excel时没有将文件数据一次性全部加载到内存中,而是从磁盘上一行行读取数据,逐个解析。
EasyExcel采用一行一行的解析模式,并将一行的解析结果以观察者的模式通知处理(AnalysisEventListener)
三 写实战
1 创建一个普通的maven项目
项目名:alibaba_easyexcel
2 pom中引入xml相关依赖
<dependencies>
<!-- easyexcel -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>2.1.7</version>
</dependency>
<!-- easyexcel依赖slf4j-simple -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>1.7.5</version>
</dependency>
<!-- easyexcel依赖xmlbeans -->
<dependency>
<groupId>org.apache.xmlbeans</groupId>
<artifactId>xmlbeans</artifactId>
<version>3.1.0</version>
</dependency>
<!-- lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.10</version>
</dependency>
<!-- junit -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
</dependencies>
3 创建实体类
@Data
public class ExcelStudentData {
/**
* 姓名
*/
@ExcelProperty(value = "姓名", index = 2)
private String name;
/**
* 生日
*/
@DateTimeFormat("yyyy年MM月dd日HH时mm分ss秒")
@ExcelProperty(value = "生日", index = 3)
private Date birthday;
/**
* 薪资
*/
@NumberFormat("#.##%")
@ExcelProperty(value = "薪资", index = 5)
private Double salary;
/**
* 忽略密码字段
*/
@ExcelIgnore
private String password;
}
4 创建测试
public class ExcelWriteTest {
/**
* 功能描述:07版测试
*
* @author cakin
* @date 2020/11/30
*/
@Test
public void simpleWrite07() {
String fileName = "F:/temp/simpleWrite-07.xlsx";
EasyExcel.write(fileName, ExcelStudentData.class)
.sheet("学生信息")
.doWrite(data());
}
/**
* 功能描述:03版测试
*
* @author cakin
* @date 2020/11/30
*/
@Test
public void simpleWrite03() {
String fileName = "F:/temp/simpleWrite-03.xls";
EasyExcel.write(fileName, ExcelStudentData.class)
.excelType(ExcelTypeEnum.XLS) // 默认是 XLSX
.sheet("学生信息")
.doWrite(data());
}
/**
* 功能描述:构造数据
*
* @author cakin
* @date 2020/11/30
*/
private List<ExcelStudentData> data() {
List<ExcelStudentData> list = new ArrayList<>();
for (int i = 0; i < 65535; i++) {
ExcelStudentData data = new ExcelStudentData();
data.setName("Helen" + i);
data.setBirthday(new Date());
data.setSalary(0.12345);
data.setPassword("123456");
list.add(data);
}
return list;
}
}
四 测试
五 说明
- 07版本的Excel和03版本的写入方式有所不同,03版本是一次性写入,可能会导致内容溢出问题,07版本是一条条写入。07版本写入文件后,大小较03版要小。
- 03版本的Excel一次最多可写65536行,07版本没限制。