作者:烧鸡太子爷
简介
在服务端上做过解析 Excel 的需要的敌人都晓得,Java 解析、生成 Excel 比拟有名的框架有 Apache poi、jxl,然而这些框架其实都有一个比较严重的问题就是消耗的内存比拟多,poi 有提供 SAX 模式的 API 能够在肯定水平的解决一些内存溢出的问题,然而 POI 还是存在一些缺点,比方 07 版 Excel 解压缩以及解压后存储都是在内存中实现的,内存耗费仍然很大。easyexcel 重写了 poi 对 07 版 Excel 的解析,一个 3M 的 excel 用 POI sax 解析仍然须要 100M 左右内存,改用 easyexcel 能够升高到几 M,并且再大的 excel 也不会呈现内存溢出;03 版依赖 POI 的 sax 模式,在下层做了模型转换的封装,让使用者更加简略不便。
明天要介绍的这款框架是 EasyExcel,是阿里巴巴开源的一个 excel 解决框架, 以应用简略、节俭内存著称 。
性能
EasyExcel 能大大减少占用内存的次要起因是在解析 Excel 时没有将文件数据一次性全副加载到内存中,而是从磁盘上一行行读取数据,一一解析。
EasyExcel 采纳一行一行的解析模式,并将一行的解析后果以观察者的模式告诉解决(AnalysisEventListener)
官网介绍他的 3.0.2 以上版本在 64M 内存 20 秒读取 75M(46W 行 25 列) 的 Excel,极速模式还能更快,然而内存占用会在 100M 多一点
包引入
版本阐明
截稿前最新的版本是 3.0.5,2+ 版本反对 Java7 和 Java6,+ 版本至多 Java8
- 不倡议跨大版本升级 尤其跨 2 个大版本
-
2+ 降级到 3+ 一些不兼容的中央
- 应用了自定义拦截器去批改款式的会出问题(不会编译报错)
- 读的时候 invoke 外面抛出异样,不会再额定封装一层 ExcelAnalysisException(不会编译报错)
- 款式等注解波及到 boolean or 一些枚举 值的 有变动,新增默认值(会编译报错,注解改就行)
- 大版本升级后倡议相干内容从新测试下
maven 引入
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>3.0.5</version>
</dependency>
罕用类解析
- EasyExcel 入口类,用于构建开始各种操作
- ExcelReaderBuilder ExcelWriterBuilder 构建出一个 ReadWorkbook WriteWorkbook,能够了解成一个 excel 对象,一个 excel 只有构建一个
- ExcelReaderSheetBuilder ExcelWriterSheetBuilder 构建出一个 ReadSheet WriteSheet 对象,能够了解成 excel 外面的一页, 每一页都要构建一个
- ReadListener 在每一行读取结束后都会调用 ReadListener 来解决数据
- WriteHandler 在每一个操作包含创立单元格、创建表格等都会调用 WriteHandler 来解决数据
- 所有配置都是继承的,Workbook 的配置会被 Sheet 继承,所以在用 EasyExcel 设置参数的时候,在 EasyExcel…sheet() 办法之前作用域是整个 sheet, 之后针对单个 sheet
excel 操作示例
手上有一份公司信息.xlsx, 外面有 ID,公司名称,成立工夫,涉足行业,官方网站 5 列信息,那咱们就来读取一下这份 excel 表格好了(波及到一些信息,请容许我打码)
先上解析后果
上面贴代码
-
实现信息根底类
@Data public class CompanyInfoData { // 设置表头名称 @ExcelProperty("ID") private String id; // 设置表头名称 @ExcelProperty("公司名称") private String company_name; // 设置表头名称 @ExcelProperty("成立工夫") private String create_time; // 设置表头名称 @ExcelProperty("涉足行业") private String in_industry; // 设置表头名称 @ExcelProperty("官方网站") private String official_website; }
-
创立监听类
public class ExcelListener extends AnalysisEventListener<CompanyInfoData{ // 创立 list 汇合封装最终的数据 List<CompanyInfoDatalist = new ArrayList<CompanyInfoData>(); // 一行一行去读取 excle 内容 @Override public void invoke(CompanyInfoData info, AnalysisContext analysisContext) {System.out.println("表内容"+info); list.add(info); } // 读取 excel 表头信息 @Override public void invokeHeadMap(Map<Integer, StringheadMap, AnalysisContext context) {System.out.println("表头信息:"+headMap); } // 读取实现后执行 @Override public void doAfterAllAnalysed(AnalysisContext analysisContext) {}}
-
读取文件实现 public class TestEasyExcel {
public static void main(String[] args) { String fileName = "E:\\workspace\\flywaydemo\\src\\main\\resources\\ 公司信息.xlsx"; // 这里 须要指定读用哪个 class 去读,而后读取第一个 sheet 文件流会主动敞开 EasyExcel.read(fileName, CompanyInfoData.class, new ExcelListener()).sheet().doRead(); } }
总结
easyexcel 对内存的优化相较于其余 excel 操作框架有肯定劣势,除了能够对 excel 进行一般读写以外,他对 excel 的 web 上传下载的反对都比拟敌对,有须要的同学能够去官网具体理解,官网地址:https://www.yuque.com/easyexc…