当前位置: 首页 > news >正文

使用 EasyExcel 实现高效的 Excel 读写操作

在日常开发中,Excel 文件的读写操作是一个常见的需求。EasyExcel 是阿里巴巴开源的一个高性能、易用的 Excel 读写库,可以大幅提高处理 Excel 文件的效率。它通过事件驱动模型优化了大数据量 Excel 的读写性能,非常适合处理大文件或高并发场景。

本篇博客将从 EasyExcel 的基本概念、优势、安装、读写操作以及高级用法展开,并提供清晰的代码示例。


一、EasyExcel 的核心特点

  1. 高性能:基于流式解析,低内存消耗,适合大数据量操作。
  2. 简单易用:提供了强大的注解支持,配置简单。
  3. 兼容性强:支持 Excel 2007(.xlsx)及更高版本。
  4. 事件驱动模型:按需读取,避免一次性加载所有数据到内存。
  5. 支持复杂表头:可以轻松处理多级表头、合并单元格等复杂场景。

二、安装 EasyExcel

首先,在你的 Maven 项目中引入 EasyExcel 的依赖:

<dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>4.0.3</version> <!-- 请使用最新版本 -->
</dependency>

三、基本用法

1. 写入 Excel

以下是一个简单的 Excel 写入示例:

import com.alibaba.excel.EasyExcel;import java.util.ArrayList;
import java.util.List;public class EasyExcelWriteExample {public static void main(String[] args) {String fileName = "example.xlsx";// 准备数据List<UserData> data = generateData();// 写入文件EasyExcel.write(fileName, UserData.class).sheet("用户信息").doWrite(data);}private static List<UserData> generateData() {List<UserData> list = new ArrayList<>();for (int i = 1; i <= 10; i++) {list.add(new UserData(i, "用户" + i, "user" + i + "@example.com"));}return list;}// 数据类,使用注解指定表头public static class UserData {@com.alibaba.excel.annotation.ExcelProperty("用户ID")private Integer id;@com.alibaba.excel.annotation.ExcelProperty("用户名")private String name;@com.alibaba.excel.annotation.ExcelProperty("邮箱")private String email;// 构造函数、Getter 和 Setterpublic UserData(Integer id, String name, String email) {this.id = id;this.name = name;this.email = email;}}
}
说明:
  • @ExcelProperty 注解用于指定 Excel 列的标题。
  • EasyExcel.write() 是写操作的入口,指定文件路径和数据模型。

运行以上代码后,会生成一个名为 example.xlsx 的文件,包含一张标题为“用户信息”的表单。


2. 读取 Excel

以下示例展示如何读取 Excel 文件内容:

import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.read.listener.ReadListener;import java.util.List;public class EasyExcelReadExample {public static void main(String[] args) {String fileName = "example.xlsx";// 读取文件EasyExcel.read(fileName, UserData.class, new UserDataListener()).sheet().doRead();}// 自定义监听器,处理每一行数据public static class UserDataListener implements ReadListener<UserData> {@Overridepublic void invoke(UserData data, AnalysisContext context) {System.out.println("读取到数据:" + data);}@Overridepublic void doAfterAllAnalysed(AnalysisContext context) {System.out.println("所有数据读取完毕");}}
}

四、高级功能

1. 多级表头

EasyExcel 支持复杂的多级表头:

 

java

复制代码

public class MultiLevelData {@com.alibaba.excel.annotation.ExcelProperty({"用户信息", "用户ID"})private Integer id;@com.alibaba.excel.annotation.ExcelProperty({"用户信息", "用户名"})private String name;@com.alibaba.excel.annotation.ExcelProperty({"联系方式", "邮箱"})private String email;
}

在写入时,会生成两级表头,分为“用户信息”和“联系方式”。


2. 大数据量读取

针对大文件,EasyExcel 提供了分批读取的能力。

EasyExcel.read(fileName, UserData.class, new ReadListener<UserData>() {@Overridepublic void invoke(UserData data, AnalysisContext context) {// 处理每一条数据}@Overridepublic void doAfterAllAnalysed(AnalysisContext context) {// 处理完成后执行}
}).sheet().doRead();

通过监听器,每次读取一小部分数据处理,避免内存溢出。


五、使用场景

  1. 导出数据报表:支持复杂的表格格式和多级表头,可以生成格式化的报表文件。
  2. 批量导入:支持从 Excel 导入数据到数据库,处理高并发上传。
  3. 日志分析:处理大文件日志的导入和分析。

六、常见问题

  1. 内存溢出:对于大数据量,建议使用分批读取,避免一次性加载过多数据。
  2. 日期格式问题:使用 @ExcelPropertyconverter 属性自定义日期格式。
  3. 合并单元格:需要自定义拦截器,控制单元格的样式和合并行为。

七、总结

EasyExcel 是一个功能强大且高效的 Excel 操作工具。它通过简化代码结构、优化性能和丰富的功能支持,成为 Java 开发者处理 Excel 文件的首选库。通过本篇博客的讲解,相信你已经掌握了 EasyExcel 的基本用法和高级功能,能够在实际项目中高效处理 Excel 文件。

如果你喜欢这篇文章,请点赞、收藏或分享给更多需要的小伙伴吧!

相关文章:

使用 EasyExcel 实现高效的 Excel 读写操作

在日常开发中&#xff0c;Excel 文件的读写操作是一个常见的需求。EasyExcel 是阿里巴巴开源的一个高性能、易用的 Excel 读写库&#xff0c;可以大幅提高处理 Excel 文件的效率。它通过事件驱动模型优化了大数据量 Excel 的读写性能&#xff0c;非常适合处理大文件或高并发场景…...

数据结构(栈Stack)

1.前言&#xff1a; 在计算机科学中&#xff0c;栈&#xff08;Stack&#xff09;是一种基础而存在的数据结构&#xff0c;它的核心特性是后进先出&#xff08;LIFO&#xff0c;Last In, First Out&#xff09;。想象一下&#xff0c;在现实生活中我们如何处理一堆托盘——我们…...

Windows 11 环境下 条码阅读器输入到记事本的内容不完整

使用Windows11时&#xff0c;为什么记事本应用程序中的扫描数据被截断或不完整?为什么sdo 特殊字符的显示与Windows 10 记事本应用程序不同? 很多人认为和中文输入法有关&#xff0c;其实主要问题出在这个windows11下的记事本程序上&#xff0c;大家知道这个就可以了&#x…...

【串口助手开发】visual studio 使用C#开发串口助手,生成在其他电脑上可执行文件,可运行的程序

1、改成Release&#xff0c;生成解决方案 串口助手调试成功后&#xff0c;将Debug改为Release&#xff0c;点击生成解决方案 2、运行exe文件 生成解决方案后&#xff0c;在bin文件夹下&#xff0c; Release文件夹下&#xff0c;生成相关文件 复制一整个Release文件夹&#xf…...

Redis设计与实现读书笔记

Redis设计与实现读书笔记 Redis设计与实现[^1]简单动态字符串SDS的基础定义与C字符串的差别常数获取长度杜绝缓冲区溢出减少修改字符串时带来的内存重分配次数二进制安全函数兼容 链表链表和链表节点的实现 字典字典的实现哈希表定义哈希表节点定义字典定义 哈希算法解决键冲突…...

UE5 Do Once 节点

在 Unreal Engine 5 (UE5) 中&#xff0c;Do Once 节点是一个蓝图节点&#xff0c;用于确保某个操作或代码只执行一次&#xff0c;直到某些条件被重置。它通常用于处理需要执行一次的逻辑&#xff0c;例如初始化、事件触发、或防止重复执行某些操作。 如何使用 Do Once 节点&a…...

javascript(前端)作为客户端端通过grpc与cpp(服务端)交互

参考文章 https://blog.csdn.net/pathfinder1987/article/details/129188540 https://blog.csdn.net/qq_45634989/article/details/128151766 前言 临时让我写前端, 一些配置不太懂, 可能文章有多余的步骤但是好歹能跑起来吧 你需要提前准备 公司有自带的这些, 但是版本大都…...

前端常用缓存技术深度剖析

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…...

Asp.net Mvc在VSCore中如何将增删改查的增改添加数据传输到页面(需配合上一篇Mvc的增删改查一起)

Linq集成查询&#xff08;关联Lambda&#xff09; First FirstOrDefault 找到第一个符合条件的元素 First(x >x.Id id) 返回第一个Id等于id的元素&#xff0c;如果都没有符合的&#xff0c;报错FirstOrDefault(x >x.Id id) 返回第一个Id等于id的元素&#xff0c;如果…...

Android显示系统(04)- OpenGL ES - Shader绘制三角形

一、前言&#xff1a; OpenGL 1.0采用固定管线&#xff0c;OpenGL 2.0以上版本重要的改变就是采用了可编程管线&#xff0c;Shader 编程是指使用着色器&#xff08;Shader&#xff09;编写代码来控制图形渲染管线中特定阶段的处理过程。在图形渲染中&#xff0c;着色器是在 GP…...

微信 创建小程序码-有数量限制

获取小程序码&#xff1a;小程序码为圆图&#xff0c;有数量限制。 目录 文档 接口地址 功能描述 注意事项 请求参数 对接 获取小程序码 调用获取 小程序码示例 总结 文档 接口地址 https://api.weixin.qq.com/wxa/getwxacode?access_tokenaccess_token 功能描述 …...

重生之我在异世界学编程之C语言:操作符篇

大家好&#xff0c;这里是小编的博客频道 小编的博客&#xff1a;就爱学编程 很高兴在CSDN这个大家庭与大家相识&#xff0c;希望能在这里与大家共同进步&#xff0c;共同收获更好的自己&#xff01;&#xff01;&#xff01; 本文目录 引言正文1. 算术操作符2. 关系&#xff0…...

365天深度学习训练营-第P7周:马铃薯病害识别(VGG-16复现)

文为「365天深度学习训练营」内部文章 参考本文所写记录性文章&#xff0c;请在文章开头带上「&#x1f449;声明」 &#x1f37a; 要求&#xff1a; 自己搭建VGG-16网络框架【达成√】调用官方的VGG-16网络框架【达成√】如何查看模型的参数量以及相关指标【达成√】 &#…...

解密时序数据库的未来:TDengine Open Day技术沙龙精彩回顾

在数字化时代&#xff0c;开源已成为推动技术创新和知识共享的核心力量&#xff0c;尤其在数据领域&#xff0c;开源技术的涌现不仅促进了行业的快速发展&#xff0c;也让更多的开发者和技术爱好者得以参与其中。随着物联网、工业互联网等技术的广泛应用&#xff0c;时序数据库…...

Kubernetes 告警标签规范与最佳实践

1. 前言 在现代化的 Kubernetes 运维环境中,规范的告警标签系统对于快速定位和解决问题至关重要。本文将详细介绍告警标签的设计规范和最佳实践,帮助团队建立高效的告警处理流程。 © ivwdcwso (ID: u012172506) 2. 标签体系设计 2.1 基本概念 告警标签(Labels)是一…...

前端开发 之 15个页面加载特效中【附完整源码】

前端开发 之 15个页面加载特效中【附完整源码】 文章目录 前端开发 之 15个页面加载特效中【附完整源码】八&#xff1a;圆环百分比加载特效1.效果展示2.HTML完整代码 九&#xff1a;毒药罐加载特效1.效果展示2.HTML完整代码 十&#xff1a;无限圆环加载特效1.效果展示2.HTML完…...

rsync+nfs+lrsync服务部署流程

rsyncnfslrsync服务 主机信息 主机角色外网IP内网IP主机名nfs、lsync10.0.0.31176.16.1.31nfs客户端10.0.0.7176.16.1.7web01rsync、nfs10.0.0.41172.16.1.41backup 部署流程 1.backup服务器部署rsync --下载rsync服务 [rootbackup ~]# yum install -y rsync --配置rsync服…...

基于SpringBoot+Vue的宠物咖啡馆系统-无偿分享 (附源码+LW+调试)

目录 1. 项目技术 2. 功能菜单 3. 部分功能截图 4. 研究背景 5. 研究目的 6. 可行性分析 6.1 技术可行性 6.2 经济可行性 6.3 操作可行性 7. 系统设计 7.1 概述 7.2 系统流程和逻辑 7.3 系统结构 8. 数据库设计 8.1 数据库ER图 &#xff08;1&#xff09;宠物订…...

SQLServer 服务器只接受 TLS1.0,但是客户端给的是 TLS1.2

Caused by: javax.net.ssl.SSLHandshakeException: the server selected protocol version TLS10 is not accepted by client preferences [TLS12] 原因描述&#xff1a;SQLServer 服务器只接受 TLS1.0&#xff0c;但是客户端给的是 TLS1.2 解决方法如下&#xff1a; 打开文件…...

Golang内存模型总结1(mspan、mcache、mcentral、mheap)

1.内存模型 1.1 操作系统存储模型 从上到下分别是寄存器、高速缓存、内存、磁盘&#xff0c;其中越往上速度越快&#xff0c;空间越小&#xff0c;价格越高。 关键词是多级模型和动态切换 1.2 虚拟内存与物理内存 虚拟内存是一种内存管理技术&#xff0c;允许计算机使用比…...

装饰模式(Decorator Pattern)重构java邮件发奖系统实战

前言 现在我们有个如下的需求&#xff0c;设计一个邮件发奖的小系统&#xff0c; 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式&#xff08;Decorator Pattern&#xff09;允许向一个现有的对象添加新的功能&#xff0c;同时又不改变其…...

【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15

缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下&#xff1a; struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...

UDP(Echoserver)

网络命令 Ping 命令 检测网络是否连通 使用方法: ping -c 次数 网址ping -c 3 www.baidu.comnetstat 命令 netstat 是一个用来查看网络状态的重要工具. 语法&#xff1a;netstat [选项] 功能&#xff1a;查看网络状态 常用选项&#xff1a; n 拒绝显示别名&#…...

关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案

问题描述&#xff1a;iview使用table 中type: "index",分页之后 &#xff0c;索引还是从1开始&#xff0c;试过绑定后台返回数据的id, 这种方法可行&#xff0c;就是后台返回数据的每个页面id都不完全是按照从1开始的升序&#xff0c;因此百度了下&#xff0c;找到了…...

Java - Mysql数据类型对应

Mysql数据类型java数据类型备注整型INT/INTEGERint / java.lang.Integer–BIGINTlong/java.lang.Long–––浮点型FLOATfloat/java.lang.FloatDOUBLEdouble/java.lang.Double–DECIMAL/NUMERICjava.math.BigDecimal字符串型CHARjava.lang.String固定长度字符串VARCHARjava.lang…...

在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用

1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...

在WSL2的Ubuntu镜像中安装Docker

Docker官网链接: https://docs.docker.com/engine/install/ubuntu/ 1、运行以下命令卸载所有冲突的软件包&#xff1a; for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done2、设置Docker…...

OpenLayers 分屏对比(地图联动)

注&#xff1a;当前使用的是 ol 5.3.0 版本&#xff0c;天地图使用的key请到天地图官网申请&#xff0c;并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能&#xff0c;和卷帘图层不一样的是&#xff0c;分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...

mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包

文章目录 现象&#xff1a;mysql已经安装&#xff0c;但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时&#xff0c;可能是因为以下几个原因&#xff1a;1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...

Spring数据访问模块设计

前面我们已经完成了IoC和web模块的设计&#xff0c;聪明的码友立马就知道了&#xff0c;该到数据访问模块了&#xff0c;要不就这俩玩个6啊&#xff0c;查库势在必行&#xff0c;至此&#xff0c;它来了。 一、核心设计理念 1、痛点在哪 应用离不开数据&#xff08;数据库、No…...