当前位置: 首页 > 后端技术 > Java

一个高效省内存的读写Excel的JAVA框架

时间:2023-04-01 23:34:09 Java

作者:烤鸡王子简介做过服务端解析Excel需求的朋友都知道Apachepoi是一个比较知名的Java解析生成Excel的框架,jxl,但是这些框架其实有一个很严重的问题,就是内存消耗大。poi有API提供SAX模式,一定程度上可以解决一些内存溢出的问题,但是POI还是有一些缺陷,比如07版本的Excel解压和解压后的存储都是在内存中完成,内存消耗还是很大。easyexcel改写了poi的excelversion07的分析,一个3M的excel用POIsax分析还是需要100M左右的内存。使用easyexcel可以减少到几M,excel再大也不会内存溢出;version03依赖于POI的sax模式,将模型转换封装在上层,方便用户使用。今天要介绍的框架是阿里巴巴开源的excel处理框架EasyExcel,以简单易用和节省内存着称。性能EasyExcel能够大大降低内存占用的主要原因是它在解析Excel时,并不是一次性将所有文件数据加载到内存中,而是从磁盘中逐行读取数据,并逐行解析。EasyExcel采用逐行分析模式,将逐行分析结果以观察者模式通知处理(AnalysisEventListener)。官网介绍其3.0.2及以上版本可在20秒内读取64M内存中75M(46W行25列)Excel。极速模式可以更快,但是内存占用会100M多一点。包介绍发行说明截止前最新版本为3.0.5,2+版本支持Java7和Java6,+版本至少支持Java8。不建议跨大版本升级,尤其是跨2个大版本2+升级到3+。有些不兼容的地方使用自定义拦截器修改样式,会出问题(不会报编译错误)。读取时,invoke会抛出异常,不会多封装一层ExcelAnalysisException。(不会编译报错)样式等注解涉及boolean或一些枚举值的变化,加上默认值(会编译报错,改注解即可)。大版本升级后,建议重新测试maven下的相关内容。引入com.alibabaeasyexcel3.0.5常用类解析EasyExcel入口类,用于构建和启动各种操作ExcelReaderBuilderExcelWriterBuilder构建一个ReadWorkbookWriteWorkbook可以理解为一个excel对象。一个excel只需要构建一个ExcelReaderSheetBuilderExcelWriterSheetBuilder就可以构建一个ReadSheetWriteSheet对象,可以理解为excel中的一个页面。每个页面都必须构建一个ReadListener并在读取每一行后调用它。ReadListener处理数据,WriteHandler调用WriteHandler处理数据,在每一个操作包括创建单元格,创建表格等。所有的配置都是继承的,Workbook的配置会被Sheet继承,所以用EasyExcel设置参数时,在EasyEx在cel...sheet()方法之前,作用域是整个sheet,然后对于单个sheetexcel操作例子,有一个公司信息.xlsx,里面有ID,公司名称,成立时间,涉及的行业,官网5列信息,然后我们看这个excel表格(涉及到一些信息,请允许我敲代码)先上传分析结果,下面粘贴代码实现信息basicclass@DatapublicclassCompanyInfoData{//设置标题名称@ExcelProperty("ID")privateStringid;//设置表头名称@ExcelProperty("CompanyName")privateStringcompany_name;//设置表头名称@ExcelProperty("EstablishedTime")privateStringcreate_time;//设置表头名称@ExcelProperty("Industry")privateStringin_industry;//设置表头名称@ExcelProperty("官网")privateStringofficial_website;}创建一个监听类publicclassExcelListenerextendsAnalysisEventListener();//逐行读取excel内容@Overridepublicvoidinvoke(CompanyInfoDatainfo,AnalysisContextanalysisContext){System.out.println("tablecontent"+info);列表.add(信息);}//读取excel表头信息@OverridepublicvoidinvokeHeadMap(Map