EasyExcel 处理 Excel

news/2024/9/23 14:35:57/

序言

本文介绍在日常的开发中,如何使用 EasyExcel 高效处理 Excel。

EasyExcel__2">一、EasyExcel 是什么

EasyExcel 是阿里巴巴开源的一个 Java Excel 操作类库,它基于 Apache POI 封装了简单易用的 API,使得我们能够方便地读取、写入 Excel 文件。EasyExcel 支持读写 Excel 的各种操作,包括读取 Excel 内容、写入 Excel 内容、大数据量导出、模板导出等功能。

上图是 EasyExcel 官方给出的 16M 内存 23 秒读取 75M (46W 行 25 列) 的 Excel(3.2.1+版本) 测试效果。我们可以看出 EasyExcel 具有以下特点:

  1. 高性能
  2. 低内存占用

EasyExcel__Excel_11">二、EasyExcel 读取 Excel

场景假设:我们需要读取下图 Excel 文件中的内容

image.png

2.1 引入依赖

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

2.2 编写实体类

java">@Data
public class ExcelData {// 编号private int id;// 姓名private String name;// 年龄private int age;
}

EasyExcel__Excel_35">2.3 EasyExcel 读取 Excel

java">// 读取的 Excel 路径
String filePath = "test.xlsx";
// 接收读取的数据
List<ExcelData> dataList = new ArrayList<>();// 读取数据并将数据放入 dataList
// read() 方法一共三个参数
// 第一个参数是文件路径
// 第二个参数是指定接收数据的实体类
// 第三个参数是一个 ReadListener,用于处理读取到数据之后需要做出的动作
// (此处是将读取到的数据放入 dataList 中)
EasyExcel.read(filePath, ExcelData.class, new PageReadListener<ExcelData>(dataList::addAll))
// sheet() 方法表示需要读取的 sheet,默认是第一个 sheet
// doRead() 方法表示正式执行读取操作
.sheet().doRead();// 打印读取的结果
dataList.forEach(System.out::println);

读取效果:

image.png

EasyExcel__Excel_59">三、EasyExcel 写入 Excel

场景假设:我们现在需要将如下数据写入到 Excel 中

编号姓名年龄
1zs10
2ls11
3ww12
4tq13
5zl14

3.1 定义数据实体类

java">@Data
public class ExcelData {@ExcelProperty("编号")private int id;@ExcelProperty("姓名")private String name;@ExcelProperty("年龄")private int age;
}

EasyExcel__Excel_82">3.2 EasyExcel 写入 Excel

java">// 模拟数据
List<ExcelData> dataList = Arrays.asList(new ExcelData(1, "zs", 10),new ExcelData(2, "ls", 11),new ExcelData(3, "ww", 12),new ExcelData(4, "tq", 13),new ExcelData(5, "zl", 14)
);// 定义输出路径
String outPath = "out.xlsx";// 通过 EasyExcel 写入到 Excel
// write() 方法有两个参数
// 第一个参数是输出路径
// 第二个参数是写出数据的实体类
EasyExcel.write(outPath, ExcelData.class)
// sheet() 方法,可以指定 sheet 的名称
.sheet("导出数据")
// doWrite() 方法,执行导出
.doWrite(dataList);

写入效果:

image.png

EasyExcel__109">四、EasyExcel 高级读

4.1 读取额外信息

java">// 读取路径
String filePath = "test.xlsx";
// 存放读取的内容
List<ExcelData> dataList = new ArrayList<>();// 读取
EasyExcel.read(filePath, ExcelData.class, new PageReadListener<ExcelData>(dataList::addAll) {// 重写这个方法,根据具体业务编写业务规则@Overridepublic void extra(CellExtra extra, AnalysisContext context) {switch (extra.getType()) {case COMMENT:System.out.println("执行注释的处理逻辑");break;case HYPERLINK:System.out.println("执行超链接的处理逻辑");break;case MERGE:System.out.println("执行合并单元格的处理逻辑");break;}}
})
// 读取批注
.extraRead(CellExtraTypeEnum.COMMENT)
// 读取超链接
.extraRead(CellExtraTypeEnum.HYPERLINK)
// 读取合并单元格
.extraRead(CellExtraTypeEnum.MERGE)
.sheet().doRead();

4.2 读取多个 sheet

java">String filePath = "test.xlsx";
List<ExcelData> dataList = new ArrayList<>();// 获取 ExcelReader
try (ExcelReader excelReader = EasyExcel.read(filePath).build()) {// 读取第一个 sheetReadSheet sheet1 = EasyExcel.readSheet(0).head(ExcelData.class).registerReadListener(new PageReadListener<ExcelData>(dataList::addAll)).build();// 读取第二个 sheetReadSheet sheet2 = EasyExcel.readSheet(1).head(ExcelData.class).registerReadListener(new PageReadListener<ExcelData>(dataList::addAll)).build();// 执行真正的读取操作excelReader.read(sheet1, sheet2);
}

EasyExcel__167">五、EasyExcel 模板填充

image.png

如上图所示,有时我们需要导出具有格式的 Excel 文件。如果采用普通的写入,处理格式比较麻烦,EasyExcel 提供了模板填充的方式写入。

5.1 定义模板

image.png

5.2 定义实体类

java">@Data
@NoArgsConstructor
@AllArgsConstructor
public class Score {private String name;private int chinese;private int math;private int english;
}

5.3 模板填充

java">// 模拟数据
List<Score> dataList = Arrays.asList(new Score("zs", 90, 89, 77),new Score("ls", 91, 90, 78),new Score("ww", 92, 91, 79),new Score("tq", 93, 92, 80),new Score("zl", 94, 93, 81)
);// 定义输出路径
String outPath = "templateOut.xlsx";
// 定义模板路径
String templatePath = "template.xlsx";
// 输出路径
EasyExcel.write(outPath)
// withTemplate() 方法指定使用的模板路径
.withTemplate(templatePath)
// sheet() 方法默认使用模板的第一个 sheet
.sheet()
// doFill() 方法执行填充
.doFill(dataList);

填充效果:

image.png

六、监听器

回顾一下之前使用 EasyExcel 读:

java">// 第三个参数是一个 ReadListener 对象
EasyExcel.read(filePath, ExcelData.class, new PageReadListener<ExcelData>(dataList::addAll))
.sheet().doRead();

PageReadListener 是 EasyExcel 官方提供的一个 ReadListener。该 ReadListener 会按照每读 100 条的频率处理数据。数据的具体处理逻辑交由开发人员,例如:我们使用 dataList::addAll 将数据添加到 dataList。所以,ReadListener 是 EasyExcel 提供给开发人员进行数据处理的。

image.png

以上是 EasyExcel 提供的 ReadListener,这些 ReadListener 应用于不同的使用场景,具体使用方法可参考官方文档。

七、FAQ

EasyExcel 是非常强大的 Excel 处理工具,尤其是在性能和内存占用方面。如果在开发过程中,有其他特殊需求大家可以参考官方文档寻找解决方案哦。

往期推荐

  1. 实体映射解决方案-MapStruct
  2. 动态切换数据源的最佳实践
  3. Gateway
  4. 缓存神器-JetCache
  5. Mybatis 缓存机制
  6. 为什么 MySQL 单表数据量最好别超过 2000w
  7. IoC 思想简单而深邃
  8. ThreadLocal

http://www.ppmy.cn/news/1455265.html

相关文章

Hexview工具使用说明

一般Davinci工具都会在Misc路径下面配一个hexview工具。Hexview工具是免安装的&#xff0c;功能非常强大&#xff0c;可以打开并解析hex文件和srec文件&#xff0c;哪怕这两种文件格式不一样&#xff0c;解析出来的结果是一样的。 文件描述 _examples是例子 _expdatproc是用…

VUE3从入门到精通

第一章> 1、前端工程化是什么 2、webpack的作用 3、plugin的基本使用 4、loader的基本使用 5、SourceMap的作用 第二章> 1、VUE基本使用步骤 2、各种指令的使用 3、过滤器 4、实际案例 第三章> 1、单页面应用与组件化开发 2、vue三个组成部分…

Visual Studio C++ 的一个简单示例

Visual Studio 项目属性设置&#xff1a; 项目属性→C/C→常规→附加包含目录 C:\Intel\include\iconv\include;项目属性→链接器→常规→附加库目录 C:\Intel\include\iconv\lib;项目属性→链接器→输入→附加依赖项 iconv.lib;提示缺少"iconv.dll"&#xff0c;…

SpringBoot优雅地定制JSON响应数据

提示&#xff1a;文章若有错误&#xff0c;欢迎评论区指正&#x1f36d; 文章目录 前言 一、如何使用JsonView这个注解&#xff1f; 二、应用场景 三、实战案例 注解方式 编程方式 总结 前言 最近在学习过程中发现了Jackson库的JsonView也可以改变JSON的输出结构&#xff0c;…

LSTM实战笔记(部署到C++上)——更新中

前几天由于自己的个人原因停止了学习 接下里继续更新一些自己项目中所用到的神经网络等 ——————————————————————————————————————————— LSTM代码介绍 建立LSTM模型时需要设置一些参数&#xff0c;包括输入数据的形状、LSTM层的…

border 是渐变色怎么设置 圆角 radius?

什么&#xff1f;渐变色的 border 无法设置 radius&#xff1f; 你5年开发了。ui 能做出的东西&#xff0c;你说你做不出来&#xff1f; .box {width: 100px;height: 150px;position: relative;z-index: 1;&::after {content: "";position: absolute;inset: 0;…

网络面试题目

1、BGP报文有哪些? 有5种报文,Open、 Update、 Notification、 Keepalive和 Route-refresh等5种报文类型。 2、Vxlan了解多少? VLAN作为传统的网络隔离技术,VXLAN完美地弥补了VLAN的上述不足。 VXLAN(Virtual eXtensible Local Area Network,虚拟扩展局域网),(VXL…

【多变量控制系统 Multivariable Control System】(1)DSM:术语、基本公式和MATLAB仿真【新加坡南洋理工大学】

说明&#xff1a; 题目版权归校方所有&#xff0c;仅供学习和参考使用。 DSM Control DSM Direct Synthesis Method Process Model Closed-Loop Transfer Function 基本公式 &#xff08;1&#xff09;输入、输出关系 &#xff08;2&#xff09;控制器表示 MatLab仿真…