一、EasyExcel介绍
Java解析、生成Excel比较有名的框架有Apache poi、jxl。但他们都存在一个严重的问题就是非常的耗内存,poi有一套SAX模式的API可以一定程度的解决一些内存溢出的问题,但POI还是有一些缺陷,比如07版Excel解压缩以及解压后存储都是在内存中完成的,内存消耗依然很大。easyexcel重写了poi对07版Excel的解析,能够原本一个3M的excel用POI sax依然需要100M左右内存降低到几M,并且再大的excel不会出现内存溢出,03版依赖POI的sax模式。在上层做了模型转换的封装,让使用者更加简单方便。
EasyExcel是一个基于Java的简单、省内存的读写Excel的开源项目。在尽可能节约内存的情况下支持读写百M的Excel。
文档地址:https://alibaba-easyexcel.github.io/index.html
github地址:https://github.com/alibaba/easyexcel
二、导出示例
示例链接:https://alibaba-easyexcel.github.io/quickstart/write.html
导入依赖
<dependencies>
<!-- https://mvnrepository.com/artifact/com.alibaba/easyexcel -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>2.1.1</version>
</dependency>
</dependencies>
1、创建我们实体类
此实体类主要作用就是用来读取和写入Excel文件的写入类,
使用注解@ExcelProperty修饰属性,value表示Excel文件的列名,index属性表示读取列的索引
@Data
public class UserData {
/**
* @ExcelProperty("用户id") 指定导入excel是列的名字为用户id
* 读取操作时,index指定读取第几列
*/
@ExcelProperty(value = "用户id", index = 0)
private int uid;
/**
* 同理
*/
@ExcelProperty(value = "用户姓名", index = 1)
private String name;
/**
* @ExcelIgnore 忽略这个字段,不导入excel中
*/
@ExcelIgnore
private String ex;
}
2、调用方法导出数据
往外导出数据时,需要到调用EasyExcel的write方法写入文件或者写入有个输出流中都是可以的,指定使用哪个实体类写入文件,sheet指定Excel文件页面sheet值,dowrite(写入的数据集合)
private void writer() {
List<UserData> userData = new ArrayList<>();
for (int i = 0; i < 10; i++) {
UserData data = new UserData();
data.setUid(i);
data.setName("zdk" + i);
userData.add(data);
}
// 指定写的路径
String fileName = "D:\\" + System.currentTimeMillis() + ".xlsx";
// 这里 需要指定写用哪个class去写,然后写到第一个sheet,
// 名字为模板 然后文件流会自动关闭
EasyExcel.write(fileName, UserData.class)
.sheet("模板")
.doWrite(userData);
}
三、 导入示例
示例链接:https://alibaba-easyexcel.github.io/quickstart/read.html
1、创建导入使用的实体类
和导出一样
2、创建导入监听器
此监听器主要用来监听读取Excel文件数据,用来一行行的读取数据,需要继承EasyExcel方法AnalysisEventListener,重写有三个方法(读取数据操作,读取表头操作,读取数据结束后操作)
public class ExceListener extends AnalysisEventListener<UserData> {
/**
* 进行读的操作具体执行方法,一行一行的读取数据
* 从第二行开始读取,不读取表头
*
* @param userData
* @param analysisContext
*/
@Override
public void invoke(UserData userData, AnalysisContext analysisContext) {
System.out.println(userData);
}
/**
* 读取表头信息
*
* @param headMap
* @param context
*/
@Override
public void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) {
super.invokeHeadMap(headMap, context);
System.out.println("表头信息:" + headMap);
}
/**
* 读取完数据的操作
*
* @param analysisContext
*/
@Override
public void doAfterAllAnalysed(AnalysisContext analysisContext) {
}
}
3、读取Excel文件
指定读取的文件路径
使用那个实体类读取,以及使用的监听器对象,读取那个sheet等等。
private static void read() {
// 指定读的路径
String fileName = "D:\\1627870562085.xlsx";
// 调用读的方法
EasyExcel.read(fileName, UserData.class, new ExceListener())
.sheet().doRead();
}