当前位置:   article > 正文

阿里Easyexcel开发流程/Spring cloud整合阿里easyexcel(版本2.0.6)

easyexcel

阿里Easyexcel是什么呢?我们先来看看官方描述:

 

Java解析、生成Excel比较有名的框架有Apache poi、jxl。但他们都存在一个严重的问题就是非常的耗内存,poi有一套SAX模式的API可以一定程度的解决一些内存溢出的问题,但POI还是有一些缺陷,比如07版Excel解压缩以及解压后存储都是在内存中完成的,内存消耗依然很大。easyexcel重写了poi对07版Excel的解析,能够原本一个3M的excel用POI sax依然需要100M左右内存降低到几M,并且再大的excel不会出现内存溢出,03版依赖POI的sax模式。在上层做了模型转换的封装,让使用者更加简单方便。

 

概括要点就是:

第一点:Easyexcel重写了poi对07版Excel的解析,内存使用率大大降低。

第二点:Easyexcel封装了poi对03版Excel的解析,在使用上,变得更加简洁。

 

 

版本

 

Easyexcel的使用,选对版本很重要,不然会报错。官方推荐的版本清单如下:

poi版本:3.17及以上

easyexcel版本:建议使用2.0.x及以上

 

本文的讨论及代码,基于以下版本:

poi版本:3.17

easyexcel版本:建议使用2.0.6及以上

 

pom文件部分截图如下:

  1. <dependency>
  2. <groupId>org.apache.poi</groupId>
  3. <artifactId>poi-ooxml</artifactId>
  4. <version>3.17</version>
  5. </dependency>
  6. <dependency>
  7. <groupId>org.apache.poi</groupId>
  8. <artifactId>poi</artifactId>
  9. <version>3.17</version>
  10. </dependency>
  11. <!--alibaba easyexcel-->
  12. <dependency>
  13. <groupId>com.alibaba</groupId>
  14. <artifactId>easyexcel</artifactId>
  15. <version>2.1.6</version>
  16. </dependency>

 

开发步骤

 

第一步:实现AnalysisEventListener抽象类

 

AnalysisEventListener提供2种方式处理excel,同步和异步。

同步处理直接使用SyncReadListener,easyexcel已经帮我们实现了。

异步处理需要我们自己实现AnalysisEventListener抽象类。

public class EasyExcelCommonListener extends AnalysisEventListener

 

我们这里只讨论异步处理方式。异步处理excel文件的功能。文档注释如下:

Receives the return of each piece of data parsed

翻译过来就是:接收被解析的每个数据块的返回值。这里的数据块,其实就是行记录,easyexcel是一行一行来解析的。

这里我有一个疑问:为了提升性能,这里的块,是否可以为N条记录的集合,比如一次读取1000条记录。

 

在写异步监听处理器的逻辑时,一般的思路是把处理结果封装到一个list集合中返回,如下:

private List<List<String>> datas = new ArrayList<>();

构建ExcelReader的方式不同,逐行解析返回的数据结构是不同的。可能有两种情况:

LinkedHashMap<String, String>

ArrayLIst<String>

 

数据结构为ArrayLIst<String>的情况:

 

 

数据结构为LinkedHashMap<String, String>的情况:

 

官方描述也很清楚,每处理一行,都会回调监听器的invoke方法。

此时,我们可以把解析结果一行一行的塞进list集合。

 

完整的代码,这里不再贴出,网上有很多,找一个改改就行,关键是要理解思路。

 

 

第二步:使用EasyExcelFactory读取文件

 

 

// 阿里Easyexcel正确使用姿势

// 1,使用EasyExcelFactory.read构建ExcelReader,官方推荐的做法。

// 2,指定excel文件格式(03版/07版)

excelReader = EasyExcelFactory.read(new FileInputStream(filePath), listener).excelType(choiceExcelType(filePath)).build();

read方法源码如下:

  1. /**
  2. * Build excel the read
  3. *
  4. * @param inputStream
  5. * Input stream to read.
  6. * @param readListener
  7. * Read listener.
  8. * @return Excel reader builder.
  9. */
  10. public static ExcelReaderBuilder read(InputStream inputStream, ReadListener readListener) {
  11. return read(inputStream, null, readListener);
  12. }

 

 

除了传入流外,EasyExcelFactory还支持传入文件路径或者File的方式来构建EasyExcel。

具体细节,可以参考EasyExcelFactory.class。

 

Warn:不要直接new ExcelReader,官方文件已经弃用了这种方式。

// 阿里Easyexcel错误使用姿势

// 1,直接new ExcelReader(new FileInputStream(filePath), choiceExcelType(filePath), listener)

 

如下:ExcelReader构造方法已经被标注了@ Deprecated注解(easyexcel版本:2.0.6)

  1. /**
  2. * Create new reader
  3. *
  4. * @param in
  5. * the POI filesystem that contains the Workbook stream
  6. * @param customContent
  7. * {@link AnalysisEventListener#invoke(Object, AnalysisContext) }AnalysisContext
  8. * @param eventListener
  9. * Callback method after each row is parsed
  10. * @deprecated please use {@link EasyExcelFactory#read()} build 'ExcelReader'
  11. */
  12. @Deprecated
  13. public ExcelReader(InputStream in, Object customContent, AnalysisEventListener eventListener) {
  14. this(in, customContent, eventListener, true);
  15. }

 

 

核心代码方法整理如下:

 

  1. /**
  2. * 使用easyExcel读取excel文件
  3. * @param filePath
  4. * @return 返参List<List<String>>,如果需要转化成List<String>,可以自己来写方法转化
  5. */
  6. public static List<List<String>> readExcelCommon(String filePath) {
  7. // 异步监听器,自己实现
  8. EasyExcelListener listener = new EasyExcelListener();
  9. // 读取器
  10. ExcelReader excelReader = null;
  11. try{
  12. // excelType()方法可以指定处理的exel的文件格式。如果不指定,系统会进行识别。
  13. excelReader = EasyExcelFactory.read(new FileInputStream(filePath), listener).excelType(ExcelTypeEnum.XLS).build();
  14. } catch (FileNotFoundException e) {
  15. log.error("FileNotFoundException ", e);
  16. }
  17. // 开始读取文件
  18. excelReader.readAll();
  19. // 获取文件内容
  20. List<List<String>> datas = listener.getDatas();
  21. // 关闭读取器,释放资源
  22. excelReader.finish();
  23. return datas;
  24. }

 

EasyExcelListener代码如下:
  1. /**
  2. * 自定义读取文件监听器
  3. */
  4. @Slf4j
  5. public class EasyExcelListener extends AnalysisEventListener {
  6. /**
  7. * 存放文件内容的集合
  8. */
  9. private List<List<String>> datas = new ArrayList<>();
  10. /**
  11. * 每解析一行都会回调invoke()方法
  12. *
  13. * @param object 读取后的数据对象
  14. * @param context 内容
  15. */
  16. @Override
  17. public void invoke(Object object, AnalysisContext context) {
  18. Map<String, String> map = (Map<String, String>) object;
  19. datas.add(new ArrayList<>(map.values()));
  20. }
  21. @Override
  22. public void doAfterAllAnalysed(AnalysisContext context) {
  23. //注意不要调用datas.clear(),否则getDatas为null
  24. }
  25. /**
  26. * 返回数据
  27. *
  28. * @return 返回读取的数据集合
  29. **/
  30. public List<List<String>> getDatas() {
  31. return datas;
  32. }
  33. /**
  34. * 设置读取的数据集合
  35. *
  36. * @param datas 设置读取的数据集合
  37. **/
  38. public void setDatas(List<List<String>> datas) {
  39. this.datas = datas;
  40. }
  41. }

 

 

OK,开发下来,确实简化了poi的开发步骤。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/170243
推荐阅读
相关标签
  

闽ICP备14008679号