JAVA:探索 EasyExcel 的技术指南
1、简述
在 Java 开发中,Excel 文件的读写操作是一项常见的需求。阿里巴巴开源的 EasyExcel 提供了一种高效、简洁的解决方案,特别是在处理大规模数据时表现尤为突出。本文将详细介绍 EasyExcel 的优缺点、应用场景,并通过实例展示其基本用法。
EasyExcel 官方文档
GitHub - EasyExcel
官网已停止维护
2、需求
JAVA 解析、生成Excel比较有名的框架有Apache poi、jxl。但他们都存在一个严重的问题就是非常的耗内存,poi有一套SAX模式的API可以一定程度的解决一些内存溢出的问题,但POI还是有一些缺陷,比如07版Excel解压缩以及解压后存储都是在内存中完成的,内存消耗依然很大。
EasyExcel 重写了poi对07版Excel的解析,一个3M的excel用POI sax解析依然需要100M左右内存,改用 EasyExcel 可以降低到几M,并且再大的excel也不会出现内存溢出;03版依赖POI的sax模式,在上层做了模型转换的封装,让使用者更加简单方便。
3、应用
EasyExcel 是一个用于读写 Excel 文件的开源 Java 库。与传统的 Apache POI 相比,EasyExcel 通过减少内存消耗、简化代码结构,使得处理 Excel 文件变得更加轻松,特别是在处理大文件时优势明显。
3.1 Maven 依赖
首先,在项目的 pom.xml 中添加 EasyExcel 的 Maven 依赖:
<dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>4.0.2</version>
</dependency>
3.2 写入 Excel 文件
以下代码展示了如何使用 EasyExcel 将数据写入到一个 Excel 文件中:
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.annotation.ExcelProperty;import java.util.ArrayList;
import java.util.List;public class EasyExcelWriteExample {public static void main(String[] args) {String fileName = "simpleWrite.xlsx";// 数据准备List<UserData> data = new ArrayList<>();data.add(new UserData(1, "Alice", "alice@example.com"));data.add(new UserData(2, "Bob", "bob@example.com"));// 写入数据到 Excel 文件EasyExcel.write(fileName, UserData.class).sheet("用户信息").doWrite(data);}
}// 定义数据类
class UserData {@ExcelProperty("用户ID")private Integer id;@ExcelProperty("用户名")private String name;@ExcelProperty("邮箱")private String email;public UserData(Integer id, String name, String email) {this.id = id;this.name = name;this.email = email;}// Getters and Setters
}
代码解释:
- UserData 类通过注解 @ExcelProperty 指定了 Excel 列名和属性的映射关系。
- 使用 EasyExcel.write() 方法指定写入的文件名和数据类,然后通过 sheet() 方法指定工作表名称,最后调用 doWrite() 将数据写入 Excel 文件。
3.3 读取 Excel 文件
下面的代码展示了如何使用 EasyExcel 从 Excel 文件中读取数据:
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;import java.util.ArrayList;
import java.util.List;public class EasyExcelReadExample {public static void main(String[] args) {String fileName = "simpleWrite.xlsx";// 读取数据EasyExcel.read(fileName, UserData.class, new UserDataListener()).sheet().doRead();}
}// 定义数据类(与写入时相同)
class UserData {@ExcelProperty("用户ID")private Integer id;@ExcelProperty("用户名")private String name;@ExcelProperty("邮箱")private String email;// Getters and Setters
}// 定义读取时的监听器
class UserDataListener extends AnalysisEventListener<UserData> {private List<UserData> list = new ArrayList<>();@Overridepublic void invoke(UserData data, AnalysisContext context) {System.out.println("读取到数据: " + data);list.add(data);}@Overridepublic void doAfterAllAnalysed(AnalysisContext context) {System.out.println("所有数据读取完成!");}
}
代码解释:
- 读取操作使用 EasyExcel.read() 方法,指定要读取的文件名、数据类以及处理读取数据的监听器。
- AnalysisEventListener 用于处理每一行读取到的数据,通过 invoke() 方法逐行处理数据,doAfterAllAnalysed() 方法在所有数据读取完成后执行。
4、场景
4.1 优点
- 内存消耗低: EasyExcel 使用流式写入和 SAX 方式解析 Excel 文件,极大减少了内存使用,适合处理大数据量的 Excel 文件。
- 代码简洁: EasyExcel 提供了简洁的 API,可以在几行代码内完成复杂的 Excel 操作,降低了开发和维护的成本。
- 支持多种 Excel 格式: 支持 .xls 和 .xlsx 格式的读写操作。
- 支持复杂的 Excel 模板: 可以处理带有图片、表格、合并单元格等复杂模板的 Excel 文件。
- 社区活跃: 作为阿里巴巴的开源项目,EasyExcel 有着良好的社区支持和持续更新。
4.2 缺点
- 功能覆盖面有限: 相比于 Apache POI,EasyExcel 主要聚焦于数据读写,缺乏对 Excel 文件内部结构的全面操作支持。
- 较少的定制化支持: 在某些高级功能上,EasyExcel 的定制化能力较弱,例如复杂样式的设置。
- 学习曲线: 对于熟悉 Apache POI 的开发者来说,EasyExcel 的 API 可能需要一定的适应时间。
4.3 应用场景
- 大规模数据导出: 由于其低内存消耗的特点,EasyExcel 特别适合用于导出包含大量数据的 Excel 文件,如报表生成、数据备份等。
- 轻量级 Excel 操作: 对于简单的数据导入导出任务,EasyExcel 提供了极简的 API,使得开发者可以快速实现功能。
- 实时数据导出: 在需要实时生成并导出 Excel 的场景下,EasyExcel 可以在占用最小内存的情况下,高效完成任务。
5、 总结
EasyExcel 作为一种高效的 Excel 读写工具,在处理大规模数据时表现突出。其低内存消耗和简洁的 API 设计,使得开发者能够快速实现 Excel 文件的读写操作。然而,EasyExcel 也存在一些功能上的局限性,尤其是在需要复杂 Excel 操作时。因此,开发者应根据具体需求选择合适的工具。
通过这篇博客,希望你对 EasyExcel 的使用有了更清晰的理解,并能够在实际项目中有效应用。如果你有任何疑问或建议,欢迎在评论区交流讨论。
相关文章:

JAVA:探索 EasyExcel 的技术指南
1、简述 在 Java 开发中,Excel 文件的读写操作是一项常见的需求。阿里巴巴开源的 EasyExcel 提供了一种高效、简洁的解决方案,特别是在处理大规模数据时表现尤为突出。本文将详细介绍 EasyExcel 的优缺点、应用场景,并通过实例展示其基本用法…...

【数字图像处理+MATLAB】对图片进行伽马校正(Gamma Correction):使用幂律变换公式进行伽马变换
引言 伽马校正(Gamma Correction)是一种用于图像处理的技术,主要用于调整图像的亮度或对比度。其基本原理是对图像的每一个像素应用一个非线性变换,以更好地适应人眼的视觉感知。在数字图像处理中,伽马校正通常用于调…...

算法——螺旋矩阵II(leetcode59)
给你一个正整数 n ,生成一个包含 1 到 n^2所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。 对于螺旋矩阵来讲难点主要在于行或列放置元素时的边界条件,我们遵循一个循环不变量原则在放置行或列元素时遵循左闭右开来放置元…...

以往运维岗本人面试真题分享
以下是本人面试运维岗的一些面试经历,在此做个记录分享 目录 TCP/IP三次握手 IPtables IPtables四表五链都是什么? nat端口如何做? 开放本机的80端口该如何做? 如何在单用户模式下引导Centos? nginx轮询模式都有…...
macOS解决U盘装完系统容量变小的问题
发现原来256GB容量的U盘在mac电脑上只显示34GB,想起来之前用该U盘装过系统,最终搜到了以下解决方案,在此记录: (1) 查看盘符列表,找到需要格式化的U盘,假设为disk4 diskutil list(2) 卸载分区disk4 disk…...
ORA-00257: archiver error
ORA-00257: archiver error 归档满问题: 报错: SQL> conn admin/admin ERROR: ORA-00257: archiver error. Connect internal only, until freed. Warning: You are no longer connected to ORACLE. 检查空间: SQL> select name, tot…...
IO技术详解
IO监控项在监控中一直是很重要的存在,服务有IO,磁盘有IO,操作系统也有IO,IO到底是什么呢 IO IO,即“输入/输出”(Input/Output),是指计算机系统或设备之间交换数据的过程。这个概念…...
pySpark乱码
1.现象 python的变量包含中文,用format放入SQL中时,出现乱码 2.原因 python2默认编码是ascii 3.解决办法 使用python3,并且把所有print,改成带括号的 4.在pyspark中加入参数 spark.pyspark.driver.python/usr/bin/python3 …...

【MySQL 保姆级教学】事务的隔离级别(详细)--下(13)
事务的隔离级别 1. 如何理解事务的隔离性2. 事务隔离级别的分类3. 查看和设置事务隔离级别3.1 全局和会话隔离级别3.2 查看和设置隔离级别 4. 事务隔离级别的演示4.1 读未提交(Read Uncommitted)4.2 读已提交(Read Committed)4.3 …...
SpringBoot(十三)SpringBoot配置webSocket
在PHP版本的博客中,我使用PHPswoole实现了webscoket即时聊天的功能。 在java版本的博客中,我也想使用webscoket来实现即时聊天的功能,下边是我实现过程的一个记录。 一:在pom.xml中添加记录 <!-- spring-websocket start --&…...

OA系统都有哪些功能?OA办公系统功能大测评
随着现代企业对效率和协作的需求不断增加,OA办公系统已成为许多企业日常运营的重要工具。 一个功能完备的OA系统不仅能帮助企业提高办公效率,还能优化各类工作流程,从文档管理到审批流程、任务管理等,它为企业提供了全方位的支持…...

优化布线拥塞
Note:文章内容以 Xilinx 系列 FPGA 进行讲解 随着设计规模的增大和复杂度的提升,布线拥塞成为常见的问题,尤其是在用UltraScale FPGA或UltraScale FPGA时,布线拥塞往往成为时序收敛的瓶颈,也成为编译时间过长的“罪魁…...

盲盒APP开发,电商模式下盲盒的未知乐趣
在互联网电商模式逐渐成熟的当下,盲盒电商为消费者提供了一个全新的娱乐购物体验,让众多粉丝和消费者通过手机系统就可以体验拆盲盒的惊喜感和刺激性。在消费者享受线上拆盲盒的乐趣时,企业也能够获得新的发展机遇,扩大发展空间。…...

RocketMQ-02 集群架构部署
根据上一章《RocketMQ消费模型和部署模型》得知,启动rocketmq非常简单,只需要分别执行mqnamesrv启动NameServer,执行mqbroker启动Broker即可。但生产环境不可能仅使用单节点MQ,为提高可用性和吞吐量,生产常使用集群模式…...
处理报文后 展示在qtdesigner界面 ,有大量数据存储 怎样创建临时文件减少内存占用
处理大量数据并将其展示在 Qt Designer 创建的界面中时,确实可能会遇到内存占用过高的问题。使用临时文件来存储和管理数据是一种有效的解决方案,可以帮助减少内存占用。 import os import shutil import tempfile from PyQt5.QtWidgets import QApplica…...

后端-实现excel的导出功能(超详细讲解)
首先,不管是一大段文字还是一个几行几列的表格实现方式都是一样的。把动态的内容使用英文单词代替。动态的内容加不加下划线都可以,加了下划线最后生成的表格动态内容部分带有下划线,不加下划线最后生成的表格动态内容部分不带下划线。大家各…...
Docker compose部署portainer
整个工具的代码都在Gitee或者Github地址内 gitee:solomon-parent: 这个项目主要是总结了工作上遇到的问题以及学习一些框架用于整合例如:rabbitMq、reids、Mqtt、S3协议的文件服务器、mongodb github:GitHub - ZeroNing/solomon-parent: 这个项目主要是…...

【游戏引擎之路】登神长阶(十四)——OpenGL教程:士别三日,当刮目相看
【游戏引擎之路】登神长阶(十四)——OpenGL教程:士别三日,当刮目相看 2024年 5月20日-6月4日:攻克2D物理引擎。 2024年 6月4日-6月13日:攻克《3D数学基础》。 2024年 6月13日-6月20日:攻克《3D…...
相等日期问题(c++方法解决)
问题描述 对于一个日期,我们可以计算出年份的各个数位上的数字之和,也可以分别计算月和日的各位数字之和。请问从 1900 年 1 月 1 日至 9999 年 12 月 31 日,总共有多少天,年份的数位数字之和等于月的数位数字之和加日的数位数字之…...

深度学习——优化算法、激活函数、归一化、正则化
文章目录 🌺深度学习面试八股汇总🌺优化算法方法梯度下降 (Gradient Descent, GD)动量法 (Momentum)AdaGrad (Adaptive Gradient Algorithm)RMSProp (Root Mean Square Propagation)Adam (Adaptive Moment Estimation)AdamW 优化算法总结 经验和实践建议…...
后进先出(LIFO)详解
LIFO 是 Last In, First Out 的缩写,中文译为后进先出。这是一种数据结构的工作原则,类似于一摞盘子或一叠书本: 最后放进去的元素最先出来 -想象往筒状容器里放盘子: (1)你放进的最后一个盘子(…...

7.4.分块查找
一.分块查找的算法思想: 1.实例: 以上述图片的顺序表为例, 该顺序表的数据元素从整体来看是乱序的,但如果把这些数据元素分成一块一块的小区间, 第一个区间[0,1]索引上的数据元素都是小于等于10的, 第二…...
FFmpeg 低延迟同屏方案
引言 在实时互动需求激增的当下,无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作,还是游戏直播的画面实时传输,低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架,凭借其灵活的编解码、数据…...
《Playwright:微软的自动化测试工具详解》
Playwright 简介:声明内容来自网络,将内容拼接整理出来的文档 Playwright 是微软开发的自动化测试工具,支持 Chrome、Firefox、Safari 等主流浏览器,提供多语言 API(Python、JavaScript、Java、.NET)。它的特点包括&a…...

从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路
进入2025年以来,尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断,但全球市场热度依然高涨,入局者持续增加。 以国内市场为例,天眼查专业版数据显示,截至5月底,我国现存在业、存续状态的机器人相关企…...
镜像里切换为普通用户
如果你登录远程虚拟机默认就是 root 用户,但你不希望用 root 权限运行 ns-3(这是对的,ns3 工具会拒绝 root),你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案:创建非 roo…...

OPenCV CUDA模块图像处理-----对图像执行 均值漂移滤波(Mean Shift Filtering)函数meanShiftFiltering()
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 在 GPU 上对图像执行 均值漂移滤波(Mean Shift Filtering),用于图像分割或平滑处理。 该函数将输入图像中的…...
解决:Android studio 编译后报错\app\src\main\cpp\CMakeLists.txt‘ to exist
现象: android studio报错: [CXX1409] D:\GitLab\xxxxx\app.cxx\Debug\3f3w4y1i\arm64-v8a\android_gradle_build.json : expected buildFiles file ‘D:\GitLab\xxxxx\app\src\main\cpp\CMakeLists.txt’ to exist 解决: 不要动CMakeLists.…...
学习一下用鸿蒙DevEco Studio HarmonyOS5实现百度地图
在鸿蒙(HarmonyOS5)中集成百度地图,可以通过以下步骤和技术方案实现。结合鸿蒙的分布式能力和百度地图的API,可以构建跨设备的定位、导航和地图展示功能。 1. 鸿蒙环境准备 开发工具:下载安装 De…...
stm32进入Infinite_Loop原因(因为有系统中断函数未自定义实现)
这是系统中断服务程序的默认处理汇编函数,如果我们没有定义实现某个中断函数,那么当stm32产生了该中断时,就会默认跑这里来了,所以我们打开了什么中断,一定要记得实现对应的系统中断函数,否则会进来一直循环…...