一、EasyExcel 介绍
1、EasyExcel 特点
- Java 领域解析、生成 Excel 比较有名的框架有 Apache poi、jxl 等。但他们都存在一个严重的问题就是非常的耗内存。如果你的系统并发量不大的话可能还行,但是一旦并发上来后一定会 OOM 或者 JVM 频繁的 full gc。
- EasyExcel 是阿里巴巴开源的一个 excel 处理框架,以使用简单、节省内存著称。
- EasyExcel 能大大减少占用内存的主要原因是在解析 Excel 时没有将文件数据一次性全部加载到内存中,而是从磁盘上一行行读取数据,逐个解析。
- EasyExcel 采用一行一行的解析模式,并将一行的解析结果以观察者的模式通知处理(AnalysisEventListener)。
2、官方网站
https://github.com/alibaba/easyexcel
快速开始:https://www.yuque.com/easyexcel/doc/easyexcel
二、创建项目
1、创建一个普通的 maven 项目
项目名:alibaba-easyexcel
2、pom 中引入 xml 相关依赖
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| <dependencies> <dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel</artifactId> <version>2.1.7</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-simple</artifactId> <version>1.7.5</version> </dependency> <dependency> <groupId>org.apache.xmlbeans</groupId> <artifactId>xmlbeans</artifactId> <version>3.1.0</version> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.12</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> </dependency> </dependencies>
|
三、写
1、创建实体类
1 2 3 4 5 6 7 8 9 10 11 12
| package com.atguigu.easyexcel.dto;
@Data public class ExcelStudentDTO { @ExcelProperty("姓名") private String name; @ExcelProperty("生日") private Date birthday; @ExcelProperty("薪资") private Double salary; }
|
2、写数据
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
| package com.atguigu.easyexcel;
public class ExcelWriteTest { @Test public void simpleWriteXlsx() { String fileName = "d:/Test.xlsx"; EasyExcel.write(fileName, ExcelStudentDTO.class).sheet("工作表1").doWrite(data()); }
@Test public void simpleWriteXls() {
String fileName = "d:/test.xls"; EasyExcel.write(fileName, ExcelStudentDTO.class).excelType(ExcelTypeEnum.XLS).sheet("工作表1").doWrite(data()); }
private List<ExcelStudentDTO> data() { List<ExcelStudentDTO> list = new ArrayList<>();
for (int i = 0; i < 10; i++) { ExcelStudentDTO data = new ExcelStudentDTO(); data.setName("Hello" + i); data.setBirthday(new Date()); data.setSalary(8888.88); list.add(data); } return list; } }
|
3、写入大数据量
xls 版本的 Excel 最多一次可写 65535 行
xlsx 版本的 Excel 最多一次可写 1048575 行
四、读
1、参考文档
https://www.yuque.com/easyexcel/doc/read
2、创建监听器
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| package com.atguigu.easyexcel.dto.listener;
@Slf4j public class ExcelStudentDTOListener extends AnalysisEventListener<ExcelStudentDTO> {
@Override public void invoke(ExcelStudentDTO data, AnalysisContext context) { System.out.println("解析到一条数据:" + data);
}
@Override public void doAfterAllAnalysed(AnalysisContext context) { log.info("所有数据解析完成!"); } }
|
3、测试用例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| package com.atguigu.easyexcel;
public class ExcelReadTest {
@Test public void simpleReadXlsx() {
String fileName = "d:/Test.xlsx"; EasyExcel.read(fileName, ExcelStudentDTO.class, new ExcelStudentDTOListener()).sheet().doRead(); }
@Test public void simpleReadXls() {
String fileName = "d:/test.xls"; EasyExcel.read(fileName, ExcelStudentDTO.class, new ExcelStudentDTOListener()).excelType(ExcelTypeEnum.XLS).sheet().doRead(); } }
|