赞
踩
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>
此实体类主要作用就是用来读取和写入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; }
往外导出数据时,需要到调用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
和导出一样
此监听器主要用来监听读取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) { } }
指定读取的文件路径
使用那个实体类读取,以及使用的监听器对象,读取那个sheet等等。
private static void read() {
// 指定读的路径
String fileName = "D:\\1627870562085.xlsx";
// 调用读的方法
EasyExcel.read(fileName, UserData.class, new ExceListener())
.sheet().doRead();
}
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。