• easyexcel 2.2.6 新版本以列表的形式读取 Excel


    使用步骤:

    注:讲述使用 EasyExcel 的读取 Excel 数据列表的案例,项目基于 springboot + maven 模式。

    1、引入 EasyExcel 依赖包,文章以 easyexcel 2.2.6 为基础。

    1. <dependency>
    2. <groupId>com.alibaba</groupId>
    3. <artifactId>easyexcel</artifactId>
    4. <version>2.2.6</version>
    5. </dependency>

    2、创建 Excel 内容处理转换类 StringArrayExcelReadListener,该类须是 AnalysisEventListener 的子类,并重写 invoke、invokeHeadMap 等方法。

    1. import com.alibaba.excel.context.AnalysisContext;
    2. import com.alibaba.excel.event.AnalysisEventListener;
    3. import lombok.extern.slf4j.Slf4j;
    4. import java.util.ArrayList;
    5. import java.util.List;
    6. import java.util.Map;
    7. import java.util.stream.Collectors;
    8. /**
    9. * StringList 解析监听器
    10. * @author Lingyejun
    11. * @since 2022-11-12
    12. */
    13. @Slf4j
    14. public class StringArrayExcelReadListener extends AnalysisEventListener<Map<String, String>> {
    15. /**
    16. * 存储读取到的表头
    17. */
    18. private List<String> head = new ArrayList<>();
    19. /**
    20. * 存储读取到的 Excel 数据
    21. */
    22. private List<List<String>> data = new ArrayList<>();
    23. /**
    24. * 每解析一行都会回调invoke()方法
    25. * @param item 读取后的数据对象
    26. * @param context 内容
    27. */
    28. @Override
    29. public void invoke(Map<String, String> item, AnalysisContext context) {
    30. if(item != null && !item.isEmpty()) {
    31. List<String> info = item.entrySet().stream().map(e -> e.getValue()).collect(Collectors.toList());
    32. data.add(info);
    33. }
    34. }
    35. @Override
    36. public void doAfterAllAnalysed(AnalysisContext context) {
    37. }
    38. /**
    39. * 处理读取到的表头数据
    40. * @param headMap
    41. * @param context
    42. */
    43. @Override
    44. public void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) {
    45. if(headMap != null && !headMap.isEmpty()) {
    46. head = headMap.entrySet().stream().map(e -> e.getValue()).collect(Collectors.toList());
    47. }
    48. }
    49. /**
    50. * 获取表头数据信息
    51. * @return
    52. */
    53. public List<String> getHead() {
    54. return this.head;
    55. }
    56. /**
    57. * 获取读取到的 Excel 数据
    58. * @return
    59. */
    60. public List<List<String>> getData() {
    61. return this.data;
    62. }
    63. }

    3、读取文件流,并读取 Excel 文件信息。

    1. @PostMapping("importExcel")
    2. public void excelImportAdd(@RequestParam("file") MultipartFile file) {
    3.     if (file.isEmpty()) {
    4.     throw new QuZuException("请选择上传文件");
    5. }
    6. InputStream inputStream;
    7. try {
    8.     inputStream = file.getInputStream();
    9. } catch (IOException e) {
    10.     e.printStackTrace();
    11. throw new QuZuException("解析文件错误");
    12. }
    13. StringArrayExcelReadListener listener = new StringArrayExcelReadListener();
    14. ExcelReader reader = EasyExcelFactory.read(inputStream, listener).build();
    15. // 读取Sheet,从第0行开始读取(表示从表头开始读)
    16. ReadSheet readSheet = EasyExcel.readSheet(0).build();
    17. reader.read(readSheet);
    18. reader.finish();
    19. List<String> head = listener.getHead();
    20. System.out.println(JSON.toJSONString(head));
    21. List<List<String>> data = listener.getData();
    22. System.out.println(JSON.toJSONString(data));
    23. }

    概念普及

    1.什么是POI

    其中Apache POI 是用Java编写的免费开源的跨平台的 Java API,Apache POI提供API给Java程序对Microsoft Office格式档案读和写的功能。POI为“Poor Obfuscation Implementation”的首字母缩写,意为“简洁版的模糊实现”。

    在Java技术生态圈中,可以进行Excel文件处理的主流技术包括: Apache POI 、 JXL 、 Alibaba EasyExcel 等。

    其中各个技术都有最适合的场景

    Apache POI 基于 DOM 方式进行解析,将文件直接加载内存,所以速度较快,适合 Excel 文件数据量不大的应用场景。

    JXL 只支持Excel 2003以下版本,所以不太常见。

    Alibaba EasyExcel 采用逐行读取的解析模式,将每一行的解析结果以观察者的模式通知处理(AnalysisEventListener),所以比较适合数据体量较大的 Excel 文件解析。

    本文我们使用POI作为处理Excel文件的技术。

    2.为什么要用POI?

    主要用于导入导出大量数据例:在开发过程中常常有客户这样子要求:你要把我们的报表直接用Excel打开(电信系统、银行系统)。或者是:我们已经习惯用Excel打印。这样在我们实际的开发中,很多时候需要实现导入、导出Excel的应用时。有大量的报表需要导出(从数据库导出为Excel),另外在做测试的时候又需要往数据库里面导入很多测试数据(从Excel导入数据库)(如数据分析统计)即将上线的电商网站,大量的基础数据需要录入,人工一条一条录入不太现实,这时候就用到了poi导入

    poi 属于 Apache旗下 http://poi.apache.org/

    当然: poi 不仅仅导入导出 Excel;可以用于Office 其他办公软件---word等等;

    3.POI的缺点

    Java解析、生成Excel比较有名的框架有Apache poi、jxl。但他们都存在一个严重的问题就是非常的耗内存,poi有一套SAX模式的API可以一定程度的解决一些内存溢出的问题,但POI还是有一些缺陷,比如07版Excel解压缩以及解压后存储都是在内存中完成的,内存消耗依然很大。easyexcel重写了poi对07版Excel的解析,能够将原本一个3M的excel文件,在之前使用POI sax依然需要100M左右内存才可以完成解析,降低到几M就可以了,并且再大的excel不会出现内存溢出。总之Alibaba EasyExcel相对于Apache POI的话,它是定位为海量数据读取。

    本篇文章如有帮助到您,请给「翎野君」点个赞,感谢您的支持。

    首发链接:https://www.cnblogs.com/lingyejun/p/16884994.html

  • 相关阅读:
    C# 文本绘制
    外辐射源雷达信号模型
    使用docker部署微服务
    小程序A跳转小程序B并且自动登录
    Java项目实战【超级详细】
    软件被人后台篡改了收款码属于入侵吗?
    1、Mybatis简介
    基于HTML语言的环保网站的设计与实现 前后端分离 Java毕业设计·文档报告·代码讲解·安装调试
    密码学--对称加密和非对称加密联合使用
    MySQL——七、MySQL备份恢复
  • 原文地址:https://blog.csdn.net/lingyejun/article/details/127827664