作者:烧鸡太子爷

简介

在服务端上做过解析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...