EasyExcel使用详解

文章目录

  • EasyExcel使用详解
    • 一、引言
    • 二、环境准备与基础配置
      • 1、添加依赖
      • 2、定义实体类
    • 三、Excel 读取详解
      • 1、基础读取
      • 2、自定义监听器
      • 3、多 Sheet 处理
    • 四、Excel 写入详解
      • 1、基础写入
      • 2、动态列与复杂表头
      • 3、样式与模板填充
    • 五、总结

EasyExcel使用详解

在这里插入图片描述

一、引言

EasyExcel 是阿里巴巴开源的一款基于 Java 的 Excel 处理工具,专注于高性能和低内存占用,尤其适合处理百万级数据的大文件。相比传统的 Apache POI,EasyExcel 通过流式读写和智能内存管理,显著降低了内存溢出风险,同时提供了简洁的 API 和灵活的注解配置。本文将从基础配置到实际应用场景,详解 EasyExcel 的核心功能。


二、环境准备与基础配置

1、添加依赖

pom.xml 中引入 EasyExcel 依赖(以最新稳定版为例):

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

2、定义实体类

通过注解 @ExcelProperty 映射 Excel 列名或索引,@ExcelIgnore 忽略字段:

@Data
public class User {@ExcelProperty("用户ID")private Long id;@ExcelProperty(value = "姓名", index = 1)  // 指定列索引private String name;@ExcelProperty("创建时间")private Date createTime;@ExcelIgnore  // 不参与读写private String remark;
}

三、Excel 读取详解

1、基础读取

使用 PageReadListener 实现分批处理(默认每 100 条处理一次):

String fileName = "user_data.xlsx";
EasyExcel.read(fileName, User.class, new PageReadListener<User>(dataList -> {dataList.forEach(user -> System.out.println("读取数据:" + user.getName()));
})).sheet().doRead();

2、自定义监听器

实现 ReadListener 接口,手动控制数据批次:

@Slf4j
public class UserListener implements ReadListener<User> {private static final int BATCH_SIZE = 200;private List<User> cachedList = new ArrayList<>(BATCH_SIZE);@Overridepublic void invoke(User user, AnalysisContext context) {cachedList.add(user);if (cachedList.size() >= BATCH_SIZE) {saveToDatabase(cachedList);  // 模拟入库操作cachedList.clear();}}@Overridepublic void doAfterAllAnalysed(AnalysisContext context) {if (!cachedList.isEmpty()) saveToDatabase(cachedList);log.info("所有数据解析完成!");}private void saveToDatabase(List<User> list) {// 实际业务中调用 DAO 层}
}

调用方式:

EasyExcel.read(fileName, User.class, new UserListener()).sheet().doRead();

3、多 Sheet 处理

支持读取多个 Sheet,每个 Sheet 可绑定不同监听器:

try (ExcelReader excelReader = EasyExcel.read(fileName).build()) {ReadSheet sheet1 = EasyExcel.readSheet(0).head(User.class).registerReadListener(new UserListener()).build();ReadSheet sheet2 = EasyExcel.readSheet(1).head(Order.class).registerReadListener(new OrderListener()).build();excelReader.read(sheet1, sheet2);
}

四、Excel 写入详解

1、基础写入

直接写入数据列表,自动生成表头:

List<User> userList = queryUsersFromDB();  // 从数据库查询数据
EasyExcel.write("export_users.xlsx", User.class).sheet("用户列表").doWrite(userList);

2、动态列与复杂表头

通过 @ExcelProperty 定义多级表头和列顺序:

@Data
public class SaleData {@ExcelProperty({"销售信息", "订单号"})private String orderId;@ExcelProperty({"销售信息", "金额"})private BigDecimal amount;@ExcelProperty(value = "时间", index = 2)  // 指定列顺序private Date createTime;
}

3、样式与模板填充

支持基于模板的填充(如财务报表):

// 填充模板中的占位符(如 {name})
Map<String, Object> data = new HashMap<>();
data.put("name", "张三");
data.put("amount", 10000);EasyExcel.write("report.xlsx").withTemplate("template.xlsx").sheet().doFill(data);

五、总结

EasyExcel 凭借其高性能低内存占用,成为处理大文件 Excel 的首选工具。通过灵活的注解配置和事件监听机制,开发者可以轻松实现复杂的数据映射和分批处理逻辑。无论是数据导入导出,还是模板化报表生成,EasyExcel 均能高效完成。


版权声明:本博客内容为原创,转载请保留原文链接及作者信息。
参考文章

  • EasyExcel官方文档
  • CSDN:EasyExcel详解(结合官方文档)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/10853.html

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

相关文章

FIDL:Flutter与原生通讯的新姿势,不局限于基础数据类型

void initUser(User user); } 2、执行命令./gradlew assembleDebug&#xff0c;生成IUserServiceStub类和fidl.json文件 3、打开通道&#xff0c;向Flutter公开方法 FidlChannel.openChannel(getFlutterEngine().getDartExecutor(), new IUserServiceStub() { Override void…

DIFY源码解析

偶然发现Github上某位大佬开源的DIFY源码注释和解析&#xff0c;目前还处于陆续不断更新地更新过程中&#xff0c;为大佬的专业和开源贡献精神点赞。先收藏链接&#xff0c;后续慢慢学习。 相关链接如下&#xff1a; DIFY源码解析

87.(3)攻防世界 web simple_php

之前做过&#xff0c;回顾 12&#xff0c;攻防世界simple_php-CSDN博客 进入靶场 <?php // 显示当前 PHP 文件的源代码&#xff0c;方便调试或查看代码结构 // __FILE__ 是 PHP 的一个魔术常量&#xff0c;代表当前文件的完整路径和文件名 show_source(__FILE__);// 包含…

x86-64数据传输指令

关于汇编语言一些基础概念的更详细的介绍&#xff0c;可移步MIPS指令集&#xff08;一&#xff09;基本操作_mips指令 sw-CSDN博客 该指令集中一个字2字节。 该架构有16个64位寄存器&#xff0c;名字都以%r开头&#xff0c;每个寄存器的最低位字节&#xff0c;低1~2位字节&…

网络工程师 (8)存储管理

一、页式存储基本原理 &#xff08;一&#xff09;内存划分 页式存储首先将内存物理空间划分成大小相等的存储块&#xff0c;这些块通常被称为“页帧”或“物理页”。每个页帧的大小是固定的&#xff0c;例如常见的页帧大小有4KB、8KB等&#xff0c;这个大小由操作系统决定。同…

全程Kali linux---CTFshow misc入门(25-37)

第二十五题&#xff1a; 提示&#xff1a;flag在图片下面。 直接检查CRC&#xff0c;检测到错误&#xff0c;就直接暴力破解。 暴力破解CRC的python代码。 import binascii import struct def brute_force_ihdr_crc(filename): # 读取文件二进制数据 with open(filen…

MySQL数据库(二)- SQL

目录 ​编辑 一 DDL (一 数据库操作 1 查询-数据库&#xff08;所有/当前&#xff09; 2 创建-数据库 3 删除-数据库 4 使用-数据库 (二 表操作 1 创建-表结构 2 查询-所有表结构名称 3 查询-表结构内容 4 查询-建表语句 5 添加-字段名数据类型 6 修改-字段数据类…

Android记事本App设计开发项目实战教程2025最新版Android Studio

平时上课录了个视频&#xff0c;从新建工程到打包Apk&#xff0c;从头做到尾&#xff0c;没有遗漏任何实现细节&#xff0c;欢迎学过Android基础的同学参加&#xff0c;如果你做过其他终端软件开发&#xff0c;也可以学习&#xff0c;快速上手Android基础开发。 Android记事本课…

STM32调试手段:重定向printf串口

引言 C语言中经常使用printf来输出调试信息&#xff0c;打印到屏幕。由于在单片机中没有屏幕&#xff0c;但是我们可以重定向printf&#xff0c;把数据打印到串口&#xff0c;从而在电脑端接收调试信息。这是除了debug外&#xff0c;另外一个非常有效的调试手段。 一、什么是pr…

如何使用 ChatBox AI 简化本地模型对话操作

部署模型请看上一篇帖子&#xff1a;本地部署DeepSeek教程&#xff08;Mac版本&#xff09;-CSDN博客 使用 ChatBox AI 简化本地模型对话操作&#xff1a; 打开 ChatBox AI 官网&#xff1a;Chatbox AI官网&#xff1a;办公学习的AI好助手&#xff0c;全平台AI客户端&#xf…

C++ Primer 自定义数据结构

欢迎阅读我的 【CPrimer】专栏 专栏简介&#xff1a;本专栏主要面向C初学者&#xff0c;解释C的一些基本概念和基础语言特性&#xff0c;涉及C标准库的用法&#xff0c;面向对象特性&#xff0c;泛型特性高级用法。通过使用标准库中定义的抽象设施&#xff0c;使你更加适应高级…

鸿蒙物流项目之基础结构

目录&#xff1a; 1、项目结构2、三种包的区别和使用场景3、静态资源的导入4、颜色样式设置5、修改项目名称和图标6、静态包基础目录7、组件的抽离8、在功能模块包里面引用静态资源包的组件 1、项目结构 2、三种包的区别和使用场景 3、静态资源的导入 放在har包中&#xff0c;那…

RK3568使用QT搭建TCP服务器和客户端

文章目录 一、让RK3568开发板先连接上wifi二、客户端代码1. `widget.h` 文件2. `widget.cpp` 文件**详细讲解**1. **`Widget` 类构造函数 (`Widget::Widget`)**2. **UI 布局 (`setupUI`)**3. **连接按钮的槽函数 (`onConnectClicked`)**4. **发送消息按钮的槽函数 (`onSendMess…

Redis|前言

文章目录 什么是 Redis&#xff1f;Redis 主流功能与应用 什么是 Redis&#xff1f; Redis&#xff0c;Remote Dictionary Server&#xff08;远程字典服务器&#xff09;。Redis 是完全开源的&#xff0c;使用 ANSIC 语言编写&#xff0c;遵守 BSD 协议&#xff0c;是一个高性…

【算法设计与分析】实验8:分支限界—TSP问题

目录 一、实验目的 二、实验环境 三、实验内容 四、核心代码 五、记录与处理 六、思考与总结 七、完整报告和成果文件提取链接 一、实验目的 掌握分支界限求解问题的思想&#xff1b;针对不同的问题&#xff0c;能够利用分支界限法进行问题拆分和求解以及时间复杂度分析…

2025年大年初一篇,C#调用GPU并行计算推荐

C#调用GPU库的主要目的是利用GPU的并行计算能力&#xff0c;加速计算密集型任务&#xff0c;提高程序性能&#xff0c;支持大规模数据处理&#xff0c;优化资源利用&#xff0c;满足特定应用场景的需求&#xff0c;并提升用户体验。在需要处理大量并行数据或进行复杂计算的场景…

2025:影刀RPA使用新实践--CSDN博客下载

文章目录 一键CSDN博客下载器程序说明指导说明使用步骤 获取方法 一键CSDN博客下载器 程序说明 配置信息&#xff1a;CSDN账号&#xff08;手机号/邮箱/用户名&#xff09;、密码、博客文件类型支持markdown格式、html格式&#xff08;默认值markdown格式&#xff09;、博客保…

游戏引擎 Unity - Unity 启动(下载 Unity Editor、生成 Unity Personal Edition 许可证)

Unity Unity 首次发布于 2005 年&#xff0c;属于 Unity Technologies Unity 使用的开发技术有&#xff1a;C# Unity 的适用平台&#xff1a;PC、主机、移动设备、VR / AR、Web 等 Unity 的适用领域&#xff1a;开发中等画质中小型项目 Unity 适合初学者或需要快速上手的开…

【Postman接口测试】Postman的安装和使用

在软件测试领域&#xff0c;接口测试是保障软件质量的关键环节之一&#xff0c;而Postman作为一款功能强大且广受欢迎的接口测试工具&#xff0c;能够帮助测试人员高效地进行接口测试工作。本文将详细介绍Postman的安装和使用方法&#xff0c;让你快速上手这款工具。 一、Pos…

边缘检测算法(candy)

人工智能例子汇总&#xff1a;AI常见的算法和例子-CSDN博客 Canny 边缘检测的步骤 1. 灰度转换 如果输入的是彩色图像&#xff0c;则需要先转换为 灰度图像&#xff0c;因为边缘检测通常在单通道图像上进行。 2. 高斯滤波&#xff08;Gaussian Blur&#xff09; 由于边缘…