首页 > 其他分享 >easyexcel 2.2.6 新版本以列表的形式读取 Excel

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

时间:2022-11-21 15:05:59浏览次数:53  
标签:读取 List easyexcel Excel POI Apache 2.2 解析

使用步骤:

注:讲述使用 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的话,它是定位为海量数据读取。

 

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



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

作者:​​翎野君​



如果您喜欢或希望看到更多我的文章,可扫描二维码关注我的微信公众号《翎野君》。


转载文章请务必保留出处和署名,否则保留追究法律责任的权利。



标签:读取,List,easyexcel,Excel,POI,Apache,2.2,解析
From: https://blog.51cto.com/lingyejun/5873936

相关文章

  • JS 导入Excel数据
    需要依赖xlsx.js插件,插件可自行到官网下载最新依赖 效果图:  <!DOCTYPEhtml><html><head><metacharset="UTF-8"><title>JSExcel导入表格数据</titl......
  • JS JSON表格数据导出Excel
    我根据网上文章进行改造,没有直接照搬人家东西,不需要引入任何插件纯原生JS实现效果图:    调用代码://列letcolumn=[{text:'姓名',key:'name'},{......
  • ideaj2022.2.3激活
    通过补丁可以永久激活IDEA,前面IDEA安装方式都是一样的,主要是后面的步骤,注意看后面就行低版本参考教程:IDEA 2020.3最新永久激活码(免费激活到 2099 年,亲测有效)破......
  • centos7安装glibc_2.28
    centos7默认的gcc版本是4.8.5,无法编译高版本的glibc2.28,需要升级到gcc8.2版本注:gcc高版本和glibc2.28不兼容##查看自带默认的glibcstrings/lib64/lib.so.6|grep......
  • VBA提取Excel的系统字体名字
    此技巧的关键是知道改系统控件的ID号。代码如下:Sub提取当前电脑已安装字体名称()'定义子程序名称DimfontlistAsObjec......
  • 速码工具箱,Excel批量生成二维码
    二维码生产力工具,速码工具箱1.0发布已经有2年时间,在这两年时间里,插件收到了大家的一致好评。中间也有很多用户定制插件,并且给插件提出了宝贵的意见,插件在诸多用户案例的基......
  • openpyxl 操作Excel
    1fromopenpyxlimportload_workbook23#加载excel4wb_obj=load_workbook(filename="test_data.xlsx")56#获取所有表单名称7sheet_name_list=wb_......
  • EXCEL快捷键
         ......
  • SAP UI5 SmartTable 控件本地运行时进行 Excel 导出的单步调试
    点击SmartTable控件生成的表格控件的ExporttoExcel时,遇到如下错误消息:Thefollowingerrorhasoccurredduringexport:Unexpectedserverresponse:SmartT......
  • 2.2 电子秤模拟——背景介绍及需求分析
    电子秤需求分析显示屏按键(不同功能,不同水果)称量模块(测量并记录质量)存储模块(存储水果价格)计算模块(加法、乘法)任务分析总价=水果1质量价格1+水果2质量价格2+水果3质......