关于java:一款高效又省内存的读写Excel的JAVA框架

52次阅读

共计 2661 个字符,预计需要花费 7 分钟才能阅读完成。

作者:烧鸡太子爷

简介

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

正文完
 0