EasyExcel概述
EasyExcel
EasyExcel特点
1、Java领域解析生成Excel在早期有名的框架有Apache poi,jxl等,但是他们都存在一个非常严重的问题,就是非常消耗内存
假如系统并发量提高,一定会OOM或者频繁full GC
2、EasyExcel由阿里巴巴提供的一个开源的excel处理框架,以使用简单,节省内存著称。它能大大减少占用内存的主要原因是在解析Excel时没有将文件数据一次性全部加载进内存中,而是一行一行读取,诸葛解析
3、EasyExcel采用一行一行的解析模式,并将一行的解析结果以观察者的模式通知处理
使用EasyExcel进行写操作
最简单的写操作
1、新建一个新的maven项目:excel-easydemo
2、引入依赖
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| <dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel</artifactId> <version>2.2.1</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>3.17</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>3.17</version> </dependency>
|
因为EasyExcel是对POI进行的改进,所以我们需要POI,并且easyexcel对应poi的版本不能有问题
建议为了开发方面,顺便引入swagger和lombok
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.12</version> </dependency>
<dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger2</artifactId> <version>2.7.0</version> </dependency> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger-ui</artifactId> <version>2.7.0</version> </dependency>
|
3、创建一个实体类,要和excel中的数据进行对应,excel中的数据的列对应着实体类中的数据,比如:
表中现在有一级分类和二级分类,那么在实体类中就需要一级分类和二级分类
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| package com.howling.excel;
import com.alibaba.excel.annotation.ExcelProperty; import lombok.Data;
@Data public class DemoData { @ExcelProperty("学生编号") private Integer sno; @ExcelProperty("学生名字") private String sname; }
|
4、编写代码进行easyexcel的写操作
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.howling.excel;
import com.alibaba.excel.EasyExcel; import com.alibaba.excel.write.builder.ExcelWriterBuilder;
import java.util.ArrayList; import java.util.List;
public class TestEasyExcel { public static void main(String[] args) {
String fileName = "E:\\write.xlsx";
ExcelWriterBuilder write = EasyExcel.write(fileName, DemoData.class); write.sheet("学生列表").doWrite(getData());
}
private static List<DemoData> getData() { List<DemoData> list = new ArrayList<DemoData>();
for (int i = 10; i > 0; i--) { DemoData demoData = new DemoData(); demoData.setSno(i); demoData.setSname("姓名" + i); list.add(demoData); } return list; } }
|
使用EasyExcel进行读操作
最简答的读操作
1、在写操作的基础上,对实体类进行设置,添加列对应的属性
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| package com.howling.excel;
import com.alibaba.excel.annotation.ExcelProperty; import lombok.Data;
@Data public class ReadData { @ExcelProperty(value = "学生编号", index = 0) private Integer sno; @ExcelProperty(value = "学生姓名", index = 1) private String sname; }
|
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 36 37 38 39
| package com.howling.excel;
import com.alibaba.excel.context.AnalysisContext; import com.alibaba.excel.event.AnalysisEventListener; import com.alibaba.excel.metadata.CellData;
import java.util.Map;
public class ExcelListener extends AnalysisEventListener<DemoData> {
public void invoke(DemoData demoData, AnalysisContext analysisContext) { System.out.println("*******" + demoData); }
public void invokeHead(Map<Integer, CellData> headMap, AnalysisContext context) { System.out.println("表头:" + headMap); }
public void doAfterAllAnalysed(AnalysisContext analysisContext) {
} }
|
3、最终方法的调用
1 2 3 4 5 6 7 8
| public static void main(String[] args) {
String fileName = "E:\\write.xlsx";
EasyExcel.read(fileName,DemoData.class,new ExcelListener()).sheet().doRead(); }
|
指定EasyExcel从指定的行数开始读取数据
只需要设置headRowNumber
即可
1 2 3 4 5 6 7
| public class TestEasyExcel { public static void main(String[] args) {
String fileName = "E:\\write.xlsx"; EasyExcel.read(fileName,DemoData.class,new ExcelListener()).sheet().headRowNumber(2).doRead(); }
|