第一次正式的写文章进行分享,如果文章中有什么问题,欢迎大家在文末的群内反馈。
一、背景
为什么会用Easyexcel来做Excel上传
本文来源gaodai.ma#com搞#代!码(网
平时项目中经常使用EasyExcel从本地读取Excel中的数据,还有一个前端页面对需要处理的数据进行一些配置(如:Excel所在的文件夹,Excel的文件名,以及Sheet列名、处理数据需要的某些参数),由于每次都是读取的本地的文件,我就在想,如果某一天需要通过前端上传excel给我,让我来进行处理我又应该怎么办呢?我怎么才能在尽量少修改代码的前提下实现这个功能呢(由于公司经常改需求,项目已经重新写了3次了)?后来查了很多资料,发现Excel可以使用InPutStream流来读取Excel,我就突然明白了什么。
阿里巴巴语雀团队对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模式。在上层做了模型转换的封装,让使用者更加简单方便。
当然还有急速模式能更快,但是内存占用会在100M多一点。
二、集成EasyExcel?
萨达
1、 在pom.xml中添加EasyExcel依赖
<dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel</artifactId> <version>2.1.3</version> </dependency>
2、创建EasyExcel映射实体类
import com.alibaba.excel.annotation.ExcelProperty; public class ExcelEntity { // ExcelProperty中的参数要对应Excel中的标题 @ExcelProperty("ID") private int ID; @ExcelProperty("NAME") private String name; @ExcelProperty("AGE") private int age; public ExcelEntity() { } public ExcelEntity(int ID, String name, int age) { this.ID = ID; this.name = name; this.age = age; } public int getID() { return ID; } public void setID(int ID) { this.ID = ID; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
3、创建自定义Easyexcel的监听类
- 这个监听类里面每一个ExcelEntity对象代表一行数据
- 在这个监听类里面可以对读取到的每一行数据进行单独操作
- 这里的读取的数据是按照Excel中每一条数据的顺序进行读取的
import com.alibaba.excel.context.AnalysisContext; import com.alibaba.excel.event.AnalysisEventListener; import java.util.ArrayList; import java.util.List; public class UploadExcelListener extends AnalysisEventListener<ExcelEntity> { private static final Logger logger = LoggerFactory.getLogger(LoggerItemController.class); public static final List<ExcelEntity> list = new ArrayList<>(); @Override public void invoke(ExcelEntity excelEntity, AnalysisContext context) { logger.info(String.valueOf(excelEntity.getID())); logger.info(excelEntity.getName()); logger.info(String.valueOf(excelEntity.getAge())); list.add(excelEntity); }