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 优化算法总结 经验和实践建议…...
iOS 26 携众系统重磅更新,但“苹果智能”仍与国行无缘
美国西海岸的夏天,再次被苹果点燃。一年一度的全球开发者大会 WWDC25 如期而至,这不仅是开发者的盛宴,更是全球数亿苹果用户翘首以盼的科技春晚。今年,苹果依旧为我们带来了全家桶式的系统更新,包括 iOS 26、iPadOS 26…...
大话软工笔记—需求分析概述
需求分析,就是要对需求调研收集到的资料信息逐个地进行拆分、研究,从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要,后续设计的依据主要来自于需求分析的成果,包括: 项目的目的…...
Spring Boot 实现流式响应(兼容 2.7.x)
在实际开发中,我们可能会遇到一些流式数据处理的场景,比如接收来自上游接口的 Server-Sent Events(SSE) 或 流式 JSON 内容,并将其原样中转给前端页面或客户端。这种情况下,传统的 RestTemplate 缓存机制会…...
【单片机期末】单片机系统设计
主要内容:系统状态机,系统时基,系统需求分析,系统构建,系统状态流图 一、题目要求 二、绘制系统状态流图 题目:根据上述描述绘制系统状态流图,注明状态转移条件及方向。 三、利用定时器产生时…...
实现弹窗随键盘上移居中
实现弹窗随键盘上移的核心思路 在Android中,可以通过监听键盘的显示和隐藏事件,动态调整弹窗的位置。关键点在于获取键盘高度,并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...
AI书签管理工具开发全记录(十九):嵌入资源处理
1.前言 📝 在上一篇文章中,我们完成了书签的导入导出功能。本篇文章我们研究如何处理嵌入资源,方便后续将资源打包到一个可执行文件中。 2.embed介绍 🎯 Go 1.16 引入了革命性的 embed 包,彻底改变了静态资源管理的…...
IP如何挑?2025年海外专线IP如何购买?
你花了时间和预算买了IP,结果IP质量不佳,项目效率低下不说,还可能带来莫名的网络问题,是不是太闹心了?尤其是在面对海外专线IP时,到底怎么才能买到适合自己的呢?所以,挑IP绝对是个技…...
C++ 设计模式 《小明的奶茶加料风波》
👨🎓 模式名称:装饰器模式(Decorator Pattern) 👦 小明最近上线了校园奶茶配送功能,业务火爆,大家都在加料: 有的同学要加波霸 🟤,有的要加椰果…...
【Android】Android 开发 ADB 常用指令
查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...
小木的算法日记-多叉树的递归/层序遍历
🌲 从二叉树到森林:一文彻底搞懂多叉树遍历的艺术 🚀 引言 你好,未来的算法大神! 在数据结构的世界里,“树”无疑是最核心、最迷人的概念之一。我们中的大多数人都是从 二叉树 开始入门的,它…...
