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

本文涉及的产品
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: easyexcel 2.2.6 新版本以列表的形式读取 Excel

使用步骤:

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

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

<dependency>
  <groupId>com.alibaba</groupId>
  <artifactId>easyexcel</artifactId>
  <version>2.2.6</version>
</dependency>

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

import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import lombok.extern.slf4j.Slf4j;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
 * StringList 解析监听器
 * @author Lingyejun
 * @since 2022-11-12
 */
@Slf4j
public class StringArrayExcelReadListener extends AnalysisEventListener<Map<String, String>> {
    /**
     * 存储读取到的表头
     */
    private List<String> head = new ArrayList<>();
    /**
     * 存储读取到的 Excel 数据
     */
    private List<List<String>> data = new ArrayList<>();
    /**
     * 每解析一行都会回调invoke()方法
     * @param item  读取后的数据对象
     * @param context 内容
     */
    @Override
    public void invoke(Map<String, String> item, AnalysisContext context) {
        if(item != null && !item.isEmpty()) {
            List<String> info = item.entrySet().stream().map(e -> e.getValue()).collect(Collectors.toList());
            data.add(info);
        }
    }
    @Override
    public void doAfterAllAnalysed(AnalysisContext context) {
    }
    /**
     * 处理读取到的表头数据
     * @param headMap
     * @param context
     */
    @Override
    public void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) {
        if(headMap != null && !headMap.isEmpty()) {
            head = headMap.entrySet().stream().map(e -> e.getValue()).collect(Collectors.toList());
        }
    }
    /**
     * 获取表头数据信息
     * @return
     */
    public List<String> getHead() {
        return this.head;
    }
    /**
     * 获取读取到的 Excel 数据
     * @return
     */
    public List<List<String>> getData() {
        return this.data;
    }
}

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

@PostMapping("importExcel")
public void excelImportAdd(@RequestParam("file") MultipartFile file) {
    if (file.isEmpty()) {
      throw new QuZuException("请选择上传文件");
  }
  InputStream inputStream;
  try {
      inputStream = file.getInputStream();
  } catch (IOException e) {
      e.printStackTrace();
    throw new QuZuException("解析文件错误");
  }
  StringArrayExcelReadListener listener = new StringArrayExcelReadListener();
  ExcelReader reader = EasyExcelFactory.read(inputStream, listener).build();
  // 读取Sheet,从第0行开始读取(表示从表头开始读)
  ReadSheet readSheet = EasyExcel.readSheet(0).build();
  reader.read(readSheet);
  reader.finish();
  List<String> head = listener.getHead();
  System.out.println(JSON.toJSONString(head));
  List<List<String>> data = listener.getData();
  System.out.println(JSON.toJSONString(data));
}

概念普及

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的话,它是定位为海量数据读取。

 

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


目录
相关文章
|
6月前
|
easyexcel
【EasyExcel】第二篇:导出excel文件,导出多个sheet工作空间
【EasyExcel】第二篇:导出excel文件,导出多个sheet工作空间
|
28天前
|
数据处理 Python
Python实用记录(十):获取excel数据并通过列表的形式保存为txt文档、xlsx文档、csv文档
这篇文章介绍了如何使用Python读取Excel文件中的数据,处理后将其保存为txt、xlsx和csv格式的文件。
44 3
Python实用记录(十):获取excel数据并通过列表的形式保存为txt文档、xlsx文档、csv文档
|
1月前
|
easyexcel Java UED
SpringBoot中大量数据导出方案:使用EasyExcel并行导出多个excel文件并压缩zip后下载
在SpringBoot环境中,为了优化大量数据的Excel导出体验,可采用异步方式处理。具体做法是将数据拆分后利用`CompletableFuture`与`ThreadPoolTaskExecutor`并行导出,并使用EasyExcel生成多个Excel文件,最终将其压缩成ZIP文件供下载。此方案提升了导出效率,改善了用户体验。代码示例展示了如何实现这一过程,包括多线程处理、模板导出及资源清理等关键步骤。
|
3月前
|
easyexcel Java 关系型数据库
阿里巴巴-EasyExcel 基于Java的简单、省内存的读写Excel
该文章主要介绍了在Java应用中如何使用EasyExcel技术完成对Excel文件的导入和导出操作,包括环境搭建、基本概念、快速入门、进阶操作和综合应用等内容,并提供了相关代码示例和注意事项。
 阿里巴巴-EasyExcel 基于Java的简单、省内存的读写Excel
|
3月前
|
JavaScript 前端开发 easyexcel
基于SpringBoot + EasyExcel + Vue + Blob实现导出Excel文件的前后端完整过程
本文展示了基于SpringBoot + EasyExcel + Vue + Blob实现导出Excel文件的完整过程,包括后端使用EasyExcel生成Excel文件流,前端通过Blob对象接收并触发下载的操作步骤和代码示例。
575 0
基于SpringBoot + EasyExcel + Vue + Blob实现导出Excel文件的前后端完整过程
|
5月前
|
Java easyexcel
java开发excel导入导出工具类基于EasyExcel
java开发excel导入导出工具类基于EasyExcel
284 1
|
5月前
|
easyexcel Java API
SpringBoot集成EasyExcel 3.x:高效实现Excel数据的优雅导入与导出
SpringBoot集成EasyExcel 3.x:高效实现Excel数据的优雅导入与导出
1053 1
|
4月前
Excel 下拉选择列表的单元格
Excel 下拉选择列表的单元格
30 0
|
5月前
|
easyexcel Java API
Apache POI与easyExcel:Excel文件导入导出的技术深度分析
Apache POI与easyExcel:Excel文件导入导出的技术深度分析
|
6月前
|
存储 数据采集 数据可视化
Python列表到Excel表格第一列的转换技术详解
Python列表到Excel表格第一列的转换技术详解
97 0