作者:烧鸡太子爷
简介
在服务端上做过解析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...