使用 EasyExcel 高效读取大文件 Excel

使用 EasyExcel 高效读取大文件 Excel 的最佳实践

在这里插入图片描述

在现代应用中,数据处理经常涉及到大规模数据集的处理,Excel 作为一种常见的文件格式,经常用于数据导入和导出。然而,传统的 Excel 处理库如 Apache POI 在处理大文件时可能会面临内存溢出和性能瓶颈问题。阿里的 EasyExcel 是一个专为高效处理大规模 Excel 文件而设计的轻量级库,它以流式读取的方式,大幅降低了内存占用,并提高了处理效率。

本文将介绍如何使用 EasyExcel 读取大文件 Excel,避免内存问题并优化性能。

为什么选择 EasyExcel?
  • 低内存占用:EasyExcel 采用了流式读取方式,不会将整个 Excel 文件加载到内存中,大大降低了内存消耗。
  • 性能优越:相比传统的 Excel 处理库,EasyExcel 具有更高的读取和写入性能。
  • 简洁易用:API 设计简洁明了,易于集成到 Spring Boot 等主流框架中。
读取大文件 Excel 的基本步骤

以下是使用 EasyExcel 读取大文件 Excel 的步骤和代码示例。

1. 引入依赖

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

<dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.0.5</version>
</dependency>
2. 创建 Excel 数据模型

创建一个 Java 类来表示 Excel 中的每一行数据。假设我们要读取一个包含用户信息的 Excel 文件:

@Data
public class UserExcelData {@ExcelProperty("用户ID")private Long userId;@ExcelProperty("用户名")private String userName;@ExcelProperty("邮箱")private String email;
}
3. 实现自定义的 AnalysisEventListener

为了处理 Excel 中的每一行数据,我们需要实现 AnalysisEventListener 接口。该接口提供了两个核心方法:invokedoAfterAllAnalysed

public class UserExcelListener extends AnalysisEventListener<UserExcelData> {@Overridepublic void invoke(UserExcelData data, AnalysisContext context) {// 处理每一行数据System.out.println("读取到数据:" + data);}@Overridepublic void doAfterAllAnalysed(AnalysisContext context) {// 所有数据解析完成后的处理System.out.println("所有数据解析完成!");}
}
4. 读取 Excel 文件

现在,我们可以使用 EasyExcel 的 read 方法来读取大文件 Excel。以下是一个基本示例:

public void readLargeExcelFile(String filePath) {EasyExcel.read(filePath, UserExcelData.class, new UserExcelListener()).sheet().doRead();
}
5. 处理大文件的优化建议

对于大文件的处理,以下几个优化建议可以帮助提升性能并减少内存占用:

  • 分批处理:在 invoke 方法中,每读取一定数量的数据(如 1000 行),就将数据批量保存到数据库或其他存储中,避免大量数据积压在内存中。

  • 使用流式处理:EasyExcel 默认使用流式处理,但你也可以通过配置确保在大文件读取时最大限度地利用这一特性。

  • 多线程处理:对于超大文件,可以考虑将不同的 Sheet 或部分数据拆分到多个线程中并行处理。

@Override
public void invoke(UserExcelData data, AnalysisContext context) {// 分批处理dataList.add(data);if (dataList.size() >= BATCH_SIZE) {saveData(dataList);dataList.clear(); // 清理缓存,防止内存溢出}
}@Override
public void doAfterAllAnalysed(AnalysisContext context) {// 最后一批数据保存if (!dataList.isEmpty()) {saveData(dataList);}System.out.println("所有数据解析完成!");
}
6. 实现批量数据保存方法
private void saveData(List<UserExcelData> dataList) {// 将数据批量保存到数据库userRepository.saveAll(dataList);System.out.println("保存数据:" + dataList.size() + " 条");
}

总结

在处理大文件 Excel 时,EasyExcel 提供了高效且内存友好的解决方案。通过分批处理、多线程处理等方式,可以进一步提升读取和处理大文件的效率。在实际项目中,灵活运用这些技术和方法,可以帮助你轻松应对大规模数据处理的挑战。

更多EasyExcel操作,可以前往官网进行检索:EasyExcel官网🔗

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

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

相关文章

实战项目:俄罗斯方块(一)

文章目录 &#x1f34a;自我介绍&#x1f34a;vt100 控制码1.概述2.数字格式①常用数字控制码②常用控制码 &#x1f34a;绘制方格 你的点赞评论就是对博主最大的鼓励 当然喜欢的小伙伴可以&#xff1a;点赞关注评论收藏&#xff08;一键四连&#xff09;哦~ &#x1f34a;自我…

关于VUE3开发频繁引入ref,reactive,computed等基础函数。

利用unplugin-auto-import插件可以避免频繁引入ref&#xff0c;reactive&#xff0c;computed等基础函数。 1.安装unplugin-auto-import依赖 npm i -D unplugin-auto-import 2.在vite.config.ts中注入依赖 效果

Webfunny前端监控如何搭建高并发使用场景

Webfunny可以支持千万级别PV的日活量了。但是&#xff0c;我们默认的部署配置&#xff0c;是无法支持这么高的日活量的&#xff0c;需要我们做一些支持高并发的配置和操作&#xff0c;下面让我们一起看下如何让webfunny支持更高的并发量吧&#xff0c;下图为webfunny高并发架构…

AI安全前沿:模型攻击与防御策略

引言 随着chatGPT的横空出世&#xff0c;通用人工智能的时代正式开启。人工智能极大地影响了人类的生活方式和生产方式&#xff0c;例如以ChatGPT为代表的各类大模型&#xff0c;能够理解和生成人类语言&#xff0c;并以对话的方式同人类进行互动&#xff0c;能够执行撰写文本…

Hot Chips 2024:博通(Broadcom)展示AI计算ASIC的光学连接

引言 在2024年的Hot Chips会议上&#xff0c;博通展示了其最新的AI计算专用集成电路&#xff08;ASIC&#xff09;&#xff0c;这款ASIC集成了光学连接技术。这一展示不仅体现了博通在定制AI加速器领域的领先地位&#xff0c;也预示着未来数据中心网络技术的一个重要发展方向。…

重塑视频监控体验:WebRTC技术如何赋能智慧工厂视频高效管理场景

视频汇聚EasyCVR视频监控平台&#xff0c;作为一款智能视频监控综合管理平台&#xff0c;凭借其强大的视频融合汇聚能力和灵活的视频能力&#xff0c;在各行各业的应用中发挥着越来越重要的作用。 EasyCVR平台不仅兼容多种主流标准协议及私有协议/SDK的接入&#xff08;如&…

qt实现三原色滑动条变色

在qt中有这样一个控件&#xff1a; 就是这个Horizontal Slider他的作用相信大家都知道了&#xff0c;也就是通过滑动来改变数值。今天我们就使用这个控件实现一个三原色滑动变色。 实现效果&#xff1a; 1.创建UI界面 这个就不用多说了&#xff0c;这个大家就按照我的这个去…

Python虚拟环境创建和使用总结

参考&#xff1a; venv --- 虚拟环境的创建 — Python 3.12.5 文档 【Python进阶】Python虚拟环境使用全方位指南&#xff1a;从零开始轻松实践 - 知乎 (zhihu.com) Python 如何删除使用 venv 创建的 Python3 虚拟环境|极客教程 (geek-docs.com) 我们知道&#xff0c;python程序…

【C/C++】C++类与对象基本概念(抽象封装、类的定义与使用、构造函数、析构函数、静态成员、友元)

目录 七、类与对象基本概念7.1 抽象7.2 类的定义与声明7.3 访问控制7.4 类的实现与使用7.5 对象指针、this指针与对象引用7.6 构造函数7.7 析构函数7.8 拷贝构造函数7.9 类类型作为函数参数7.10 对象数组7.11 静态成员7.12 常对象与常成员&#xff08;const&#xff09;7.13 友…

讲个SystemVerilog disable语句的坑

前言 记录个使用SystemVerilog disable语句时遇到的坑&#xff0c;这个坑有点反直觉&#xff0c;以至于我当时有点不信&#xff0c;觉得可能是EDA仿真工具的问题。后来查看了SystemVerilog手册和使用不同EDA工具进行验证&#xff0c;才慢慢接受了。结论是&#xff1a;SystemVe…

ctfshow之web58~web71

目录 web58 思路一&#xff1a; 思路二&#xff1a; 思路三&#xff1a; web59~web65 web66~web67 web68~web70 web71 web58 if(isset($_POST[c])){$c $_POST[c];eval($c); }else{highlight_file(__FILE__); } PHP eval() 函数介绍 定义和用法 eval() 函数把字符串按…

新型蜜罐有哪些?未来方向如何?

前言&#xff1a;技术发展为时代带来变革&#xff0c;同时技术创新性对蜜罐产生推动力。 一、新型蜜罐的诞生 技术发展为时代带来变革&#xff0c;同时技术创新性对蜜罐产生推动力&#xff0c;通过借鉴不同技术思想、方法&#xff0c;与其它技术结合形成优势互补&#xff0c;…

python内置模块time详解(我们需要了解的多种时间格式)

Python的time模块提供了各种与时间相关的函数。我们可以获取当前时间、操作时间日期、计算两个时间差等。 时间有两种标准表示法: 数字表示: 整数或浮点数&#xff0c;通常是自从1970年1月1日以来的秒数。9个整数组成的元组&#xff1a;元组项包含年份&#xff0c;月份&#…

Diffusion 模型生成图片太慢了?用 AE(AutoEncoder) 和 VAE 加速一波!

Diffusion 模型生成图片太慢了&#xff1f;用 AE(AutoEncoder) 和 VAE(Variational AutoEncoder) 压缩图片加速一波&#xff01; 本文分为两个部分&#xff1a;理论学习和代码实践。 先预览一下 AE 和 VAE 模型的效果&#xff1a; 理论学习 本文价值 Diffusion 模型生成图片的效…

图像识别智能垃圾桶项目开发--语音命令识别垃圾

一、项目思维导图 二、语音模块配置信息 三、项目程序 main.c garbage.c garbage.h uartTool.c //串口发送数据 uartTool.h

台式机CPU温度90℃以上-排查思路

虽然现在台式机不值钱。 但是对于穷苦老百姓来说&#xff0c;还是害怕它坏掉&#xff0c;坏掉就又需要花钱买了。 ①风扇清理所有灰尘&#xff08;风扇的散热网是可以拆下来的&#xff09;&#xff0c; 主板清理所有灰尘&#xff08;用画笔或者干燥的牙刷&#xff0c;注意是…

编程效率进阶:打造你专属的 Git 别名与 PyCharm 完美结合

在日常开发中&#xff0c;Git 是我们不可或缺的工具。掌握常用 Git 命令可以帮助我们更高效地进行版本控制&#xff0c;但随着命令的复杂性增加&#xff0c;记住所有命令变得困难。这时&#xff0c;Git 别名的设置就显得尤为重要。此外&#xff0c;许多开发者使用 PyCharm 作为…

TypeScript与vue

一、为组件的props标注类型 - 在没有使用TS之前&#xff0c;是这样接受props&#xff1a; - 在TS环境中&#xff0c;是这样接受props&#xff1a; - 对于props的可选项如何限制呢&#xff1f; 1、类型限制 类型限制在接收的时候就已经定义好了 2、可选属性&#xff08;必填限制…

c# net8调用vc写的dll

dll程序&#xff08;vc,x86) 头文件 extern "C" int __declspec(dllexport) WINAPI add(int a, int b);实现 int WINAPI add(int a, int b) {return a b; }c#/net8 函数声明&#xff1a; [DllImport("dll/Dll1.dll", CallingConvention CallingCo…

c++中的匿名对象及内存管理及模版初阶

目录 c中的匿名对象 日期到天数的转换 深入理解析构 深入理解拷贝构造 内存管理 全局变量和static变量的区别&#xff1b; malloc/calloc/realloc的区别 new和delete的意义&#xff1f; operator new与operator delete函数 对比malloc和new operator 定制operator ne…