EasyExcel 处理 Excel

序言

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

一、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

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

image.png

2.1 引入依赖

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

2.2 编写实体类

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

2.3 EasyExcel 读取 Excel

// 读取的 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

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

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

3.1 定义数据实体类

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

3.2 EasyExcel 写入 Excel

// 模拟数据
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 高级读

4.1 读取额外信息

// 读取路径
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

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 模板填充

image.png

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

5.1 定义模板

image.png

5.2 定义实体类

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

5.3 模板填充

// 模拟数据
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 读:

// 第三个参数是一个 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.mzph.cn/diannao/6080.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

selenium 4.x 之验证码处理(python)

验证码处理 一般情况公司如果涉及web自动化测试需要对验证码进行处理的方式一般有一下几种&#xff1a; 关闭验证码功能&#xff08;开发处理&#xff09;设置万能验证码&#xff08;开发处理&#xff09;使用智能识别库进行验证 通过第三方打码平台识别验证码 1. 跳过验证功…

【目标检测】DEtection TRansformer (DETR)

一、前言 论文&#xff1a; End-to-End Object Detection with Transformers 作者&#xff1a; Facebook AI 代码&#xff1a; DEtection TRansformer (DETR) 特点&#xff1a; 无proposal&#xff08;R-CNN系列&#xff09;、无anchor&#xff08;YOLO系列&#xff09;、无NM…

C++入门基础(三)

这里写目录标题 引用引用概念例子1例子2例子3例子4 常引用引用的应用做参数做返回值野引用扩展 传值、传引用效率比较引用和指针的区别C对比C语言实现顺序表 内联函数概念特性 &#x1f412;&#x1f412;&#x1f412; 个人主页 &#x1f978;&#x1f978;&#x1f978; C语…

分布式八股文

什么是分布式系统? 集中式系统,可以理解为将一整个系统的所有功能,包括数据库各种都部署在一起,统一向外提供服务。分布式就是将集中式系统拆分成多个系统,每一个系统单独对外提供服务,整一个提供一整套服务。意味着能够采用更多的服务器,CPU、内存、存储资源增加,能够…

[方法] Unity 解决类《原神》角色移动方向问题

第三人称视角类的游戏有很多&#xff0c;比如《原神》、《崩坏:星穹铁道》、《剑星》、《绝地求生》等。这些游戏中&#xff0c;角色的移动方向取决于玩家的输入和相机的方向&#xff0c;例如玩家在键盘上按下D键&#xff0c;则角色会相对于相机方向向右移动&#xff0c;本篇文…

dnf游戏攻略:保姆级游戏攻略!

欢迎来到DNF&#xff0c;一个扣人心弦的2D横版格斗游戏世界&#xff01;无论你是新手还是老玩家&#xff0c;这篇攻略都将为你提供宝贵的游戏技巧和策略&#xff0c;助你在游戏中大展身手&#xff0c;成为一名强大的冒险者。 一、角色选择 在DNF中&#xff0c;角色的选择至关重…

K8S join 证书过期 节点报错:certificate has expired or is not yet valid

问题场景&#xff1a; 我是因为虚拟机&#xff0c;挂起了几天&#xff0c;再打开join节点的时候报错&#xff1a; 证书过期报错 ...其他输出 I0427 15:33:56.626776 93338 token.go:215] [discovery] Failed to request cluster-info, will try again: Get "https://…

量子城域网建设案例分析(一):广西量子通信技术试验平台

对量子城域网的讨论已经有一段时间了&#xff0c;经过近期系列文章的讨论&#xff0c;我们对城域网的整体情况、关键技术以及核心设备等都有了一些基本的认识&#xff0c;今天我计划对广西量子通信技术试验平台构建与应用研究服务采购项目进行讨论&#xff0c;通过对实际案例的…

IoTDB 入门教程⑤——数据模型和基础概念

文章目录 一、前文二、数据模型2.1 关系型数据库MySQL。2.2 时序数据库TDengine2.3 时序数据库InfluxDB2.4 时序数据库IoTDB&#xff08;本专栏的正主&#xff09; 三、基础概念3.1 数据库&#xff08;Database&#xff09;3.2 设备模板&#xff08;元数据模板&#xff09;3.3 …

asp爬虫代码简单示例

要创建一个ASP爬虫&#xff0c;你可以使用ASP内置的对象XMLHTTP或ServerXMLHTTP来发送HTTP请求&#xff0c;获取网页内容&#xff0c;然后使用ASP的内置对象HTMLFILE来解析HTML内容。以下是一个简单的ASP爬虫示例代码&#xff1a; <%初始化变量 Dim http Dim url Dim html …

C语言——小知识和小细节17

一、未能给指针成功赋值 #include <stdio.h> #include <stdlib.h> #include <string.h>void GetMemory(char* p) {p (char*)malloc(20 * sizeof(char)); }void Test() {char* str NULL;GetMemory(str);strcpy(str, "Hello World!");printf(&quo…

IDA pro动态调试so层初级教程

一、开启服务 adb push D:\MyApp\IDA_Pro_7.7\dbgsrv\android_server64 /data/local/tmpadb shell cd /data/local/tmp chmod 777 android_server64 ./android_server64二、IDA附加进程 十万个注意&#xff1a;IDA打开的so文件路径不能有中文 手机打开要调试的app 附加成功

合泰杯(HT32F52352)RTC的应用(计时)--->掉电不丢失VBAT(代码已经实现附带源码)

摘要 在HT32F52352合泰单片机开发中&#xff0c;rtc在网上还是挺少人应用的&#xff0c;找了很久没什么资料&#xff0c;现在我根据手册和官方的代码进行配置理解。 RTC在嵌入式单片机中是一个很重要的应用资源。 记录事件时间戳&#xff1a;RTC可以记录事件发生的精确时间&…

Rust move

一、move有什么用 当你在闭包前加上 move 关键字时&#xff0c;闭包会强制获取其所需变量的所有权。这意味着即使在闭包外部变量的所有权被转移给闭包&#xff0c;闭包之外的代码也不能再使用这些变量 看两段代码 fn main() {let x String::from("value");let cl…

DRF解析器源码分析

DRF解析器源码分析 1 解析器 解析请求者发来的数据&#xff08;JSON&#xff09; 使用 request.data 获取请求体中的数据。 这个 reqeust.data 的数据怎么来的呢&#xff1f;其实在drf内部是由解析器&#xff0c;根据请求者传入的数据格式 请求头来进行处理。 drf默认的解…

计算机408备考-数据结构重要知识点-数据结构的定义

请关注一下B站账号&#xff1a;谭同学很nice&#xff01;后期更新发布在这个账号上。。【计算机408备考-数据结构重要知识点-数据结构的定义-哔哩哔哩】https://b23.tv/x7shjNf 数据是信息的载体。数据元素是数据的基本单位。一个数据元素可由若干数据项组成&#xff0c;数据项…

在离线环境中将 CentOS 7.5 原地升级并迁移至 RHEL 7.9

《OpenShift / RHEL / DevSecOps 汇总目录》 说明 本文将说明如何在离线环境中将 CentOS 7.5 升级并迁移至 RHEL 7.9。为了简化准备过程&#xff0c;本文前面将在在线环境中安装用到的各种所需验证软件&#xff0c;而在后面升级迁移的时候再切换到由 ISO 构成的离线 Yum Repo…

实现优先队列——C++

目录 1.优先队列的类模板 2.仿函数的讲解 3.成员变量 4.构造函数 5。判空&#xff0c;返回size&#xff0c;返回队头 6.插入 7.删除 1.优先队列的类模板 我们先通过模板来进行初步了解 由上图可知&#xff0c;我们的模板里有三个参数&#xff0c;第一个参数自然就是你要存储的数…

使用Android Studio 搭建AOSP FrameWork 源码阅读开发环境

文章目录 概述安装Android Studio编译源码使用Android Studio打开源码制作ipr文件直接编译成功后自动打开Android Studio 修改SystemUI验证开发环境 概述 我们都知道Android的系统源码量非常之大&#xff0c;大致有frameworka层源码&#xff0c;硬件层(HAL)源码&#xff0c;内…

【华为OD机试】数组连续和(C++/Java/Python)

【华为OD机试】-(A卷+B卷+C卷+D卷)-2024真题合集目录 【华为OD机试】-(C卷+D卷)-2024最新真题目录 题目描述 给定一个含有N个正整数的数组, 求出有多少个连续区间(包括单个正整数), 它们的和大于等于x。 输入描述 第一行两个整数N x(0 < N <= 100000, 0 <= x <…