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

使用 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官网🔗

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Java内部类的应用分析
  • 【千帆AppBuilder】使用Python调用基于官方的API创建图片故事的应用,一起体验下全代码模式下是怎样的效果
  • PhpStorm下调试功能配置
  • KAN学习Day1——模型框架解析及HelloKAN
  • Spring boot整合接入Redis
  • shell脚本前置基础
  • 揭秘组合模式:C++设计模式的奥秘与应用!
  • 《基础模型时代的图像分割》研究综述
  • 视频素材网站无水印的有哪些?热门视频素材网站分享!
  • 文心快码帮你解大厂面试题:一次请求从浏览器进入到Sping框架的服务,整个请求的生命周期是什么?
  • HTB-lgnition(curl工具、yakit、 弱口令)
  • Git —— 2、配置本地与远程免密仓库免密访问、实操创建本地仓库与上github新仓库关联
  • stm32之硬件I2C读写MPU6050陀螺仪、加速度传感器应用案例
  • 2024杭电6
  • Spring之整合Mybatis底层源码解析
  • 2017-09-12 前端日报
  • CentOS学习笔记 - 12. Nginx搭建Centos7.5远程repo
  • Druid 在有赞的实践
  • java中具有继承关系的类及其对象初始化顺序
  • jquery ajax学习笔记
  • Map集合、散列表、红黑树介绍
  • Markdown 语法简单说明
  • MyEclipse 8.0 GA 搭建 Struts2 + Spring2 + Hibernate3 (测试)
  • nginx(二):进阶配置介绍--rewrite用法,压缩,https虚拟主机等
  • Spring-boot 启动时碰到的错误
  • Spring框架之我见(三)——IOC、AOP
  • 从0到1:PostCSS 插件开发最佳实践
  • 从零开始的webpack生活-0x009:FilesLoader装载文件
  • 观察者模式实现非直接耦合
  • 两列自适应布局方案整理
  • 罗辑思维在全链路压测方面的实践和工作笔记
  • 目录与文件属性:编写ls
  • 王永庆:技术创新改变教育未来
  • 为什么要用IPython/Jupyter?
  • 译自由幺半群
  • Spring Batch JSON 支持
  • #我与Java虚拟机的故事#连载10: 如何在阿里、腾讯、百度、及字节跳动等公司面试中脱颖而出...
  • $().each和$.each的区别
  • (04)odoo视图操作
  • (145)光线追踪距离场柔和阴影
  • (2)nginx 安装、启停
  • (2)STM32单片机上位机
  • (39)STM32——FLASH闪存
  • (delphi11最新学习资料) Object Pascal 学习笔记---第7章第3节(封装和窗体)
  • (Redis使用系列) Springboot 使用redis实现接口Api限流 十
  • (TipsTricks)用客户端模板精简JavaScript代码
  • (八)Docker网络跨主机通讯vxlan和vlan
  • (二)PySpark3:SparkSQL编程
  • (十六)一篇文章学会Java的常用API
  • (一)SpringBoot3---尚硅谷总结
  • (转)Linux整合apache和tomcat构建Web服务器
  • (转)详解PHP处理密码的几种方式
  • (轉貼) 蒼井そら挑戰筋肉擂台 (Misc)
  • .bat批处理(四):路径相关%cd%和%~dp0的区别
  • .NET 8 编写 LiteDB vs SQLite 数据库 CRUD 接口性能测试(准备篇)