使用 EasyExcel 高效读取大文件 Excel

news2024/12/23 13:44:56

使用 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> {

    @Override
    public void invoke(UserExcelData data, AnalysisContext context) {
        // 处理每一行数据
        System.out.println("读取到数据:" + data);
    }

    @Override
    public 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.coloradmin.cn/o/2095150.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于Java+SpringBoot+Vue的植物健康系统

基于JavaSpringBootVue的植物健康系统 前言 ✌全网粉丝20W,csdn特邀作者、博客专家、CSDN[新星计划]导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345; 某信 gzh 搜索【智能编程小助手】获取项…

(学习总结15)C++11小语法与拷贝问题

C11小语法与拷贝问题 auto关键字范围forinitializer_list深拷贝与浅拷贝写时拷贝 以下代码环境为 VS2022 C。 auto关键字 在早期 C/C 中 auto 的含义是&#xff1a;使用 auto 修饰的变量&#xff0c;是具有自动存储器的局部变量&#xff0c;不过一般都会隐藏&#xff0c;导致…

科研绘图 - Python - 柱状图代码及展示

1 import pandas as pd import matplotlib.pyplot as pltstudents pd.read_excel(./Students.xlsx)print(----原始数据----) print(students)students.sort_values(by2017,inplaceTrue,ascendingFalse) students.plot.bar(xField,y[2016,2017],color[orange,red])plt.title(I…

【Redis】Redis 客户端开发与 Java 集成:RESP协议解析与实战操作

目录 客⼾端Redis Java使⽤ 样例列表引⼊依赖配置端⼝转发连接 Redis Server基础操作字符串操作列表操作哈希表操作集合操作有序集合操作访问集群 Redis Java 集成到 Spring Boot使⽤ Spring Boot 连接 Redis 单机创建项⽬配置 redis 服务地址创建 Controller使⽤ String使⽤ L…

华为OD机试真题 - 分割均衡字符串 - 贪心算法(Python/JS/C/C++ 2024 D卷 100分)

华为OD机试 2024E卷题库疯狂收录中,刷题点这里 专栏导读 本专栏收录于《华为OD机试真题(Python/JS/C/C++)》。 刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、…

集成电路学习:什么是GPIO通用输入输出

GPIO&#xff1a;通用输入输出 GPIO&#xff0c;全称General Purpose Input/Output&#xff0c;即通用输入/输出端口&#xff0c;是嵌入式系统中非常重要的基本硬件资源之一。以下是对GPIO的详细解析&#xff1a; 一、GPIO的定义与功能 GPIO是一种非常灵活的接口&#xff0c;可…

ping不通本地虚拟机的静态ip的解决方案

找到网络配置文件 一般我们设置虚拟机文件为静态IP地址&#xff0c; 比如 /etc/sysconfig/network-scripts/ifcfg-ens33 记住Gateway 192.168.200.2 查看虚拟网络编辑器 把子网ip改为192.168.200.0 前三部分相同&#xff0c;第四部分是0 把nat设置中的网关ip改成Gateway 1…

时空图卷积网络:用于交通流量预测的深度学习框架-1

摘要 准确的交通预测对于城市交通控制和引导至关重要。由于交通流的高度非线性和复杂性&#xff0c;传统方法无法满足中长期预测任务的需求&#xff0c;且往往忽略了空间和时间的依赖关系。本文提出一种新的深度学习框架——时空图卷积网络(STGCN)来解决交通领域的时间序列预测…

「MyBatis」图书管理系统 v1.0

&#x1f387;个人主页&#xff1a;Ice_Sugar_7 &#x1f387;所属专栏&#xff1a;JavaEE &#x1f387;欢迎点赞收藏加关注哦&#xff01; 图书管理系统 v1.0 &#x1f349;登录&#x1f349;图书操作&#x1f34c;图书类&#x1f34c;页面信息&#x1f34c;操作 &#x1f34…

Java中的经典排序算法:快速排序、归并排序和计数排序详解(如果想知道Java中有关快速排序、归并排序和计数排序的知识点,那么只看这一篇就足够了!)

前言&#xff1a;排序算法在计算机科学中占有重要地位&#xff0c;不同的算法适用于不同的场景。本文将深入探讨快速排序、归并排序和计数排序。 ✨✨✨这里是秋刀鱼不做梦的BLOG ✨✨✨想要了解更多内容可以访问我的主页秋刀鱼不做梦-CSDN博客 先让我们看一下本文大致的讲解内…

新生在线分班查询,用这个小程序制作仅需一分钟!

今天许多学校已陆续开学&#xff0c;老师们又开始忙碌起来。他们需要将新生的分班信息逐一通知给每位家长&#xff0c;这不仅是一项繁琐的工作&#xff0c;而且效率也不高。传统的方法是通过电话、短信或邮件一一通知&#xff0c;这不仅耗时耗力&#xff0c;还容易出现信息传递…

百度文库文章-暂存下-------题 目: 链式简单选择排序

题 目: 链式简单选择排序 初始条件&#xff1a; 理论&#xff1a;学习了《数据结构》课程&#xff0c;掌握了基本的数据结构和常用的算法&#xff1b; 实践&#xff1a;计算机技术系实验室提供计算机及软件开发环境。 要求完成的主要任务: &#xff08;包括课程设计工作量…

如何用pytorch进行图像分类

如何用pytorch进行图像分类 使用PyTorch进行图像分类是深度学习中的一个常见任务&#xff0c;涉及一系列步骤&#xff0c;从数据预处理到模型训练和评估。下面将详细描述每个步骤&#xff0c;从零开始构建一个图像分类器。 1. 安装必要的库 在开始之前&#xff0c;首先需要确…

驱动(RK3588S)第四课时:模块化编程

目录 一、什么是模块化编程二、怎么把自己编译代码给加载到开发板上运行三、驱动编程的框架四、驱动编程具体实例1、编写单模块化驱动代码2、编写多模块化驱动代码3、编写向模块传参驱动代码4、编写多模块化驱动代码另一种方式 一、什么是模块化编程 在嵌入式里所谓的模块化编…

Vue——day07之条件渲染、列表渲染以及监测数据

目录 1.template标签 2.条件渲染 3.列表渲染 4.v-for中的key的作用以及原理 5.列表过滤 placeholder 前端空字符串 使用数据监视watch实现 使用计算属性实现 6.列表排序 7.Vue更新数据检测失败 原因 总结 1.template标签 template标签是Vue.js中的一个特殊元素&am…

kube-scheduler调度策略之预选策略(三)

一、概述 摘要&#xff1a;本文我们继续分析源码&#xff0c;并聚焦在预选策略的调度过程的执行。 二、正文 说明&#xff1a;基于 kubernetes v1.12.0 源码分析 上文我们说的(g *genericScheduler) Schedule()函数调用了findNodesThatFit()执行预选策略。 2.1 findNodesTha…

Truncated incorrect max_connections value: ‘999999‘

MySQL 的最大连接数&#xff08;max_connections&#xff09;可以设置的上限值在不同的资料中有所不同。以下是一些关键信息&#xff1a; 默认值和默认范围&#xff1a; MySQL 的默认最大连接数通常为 100 。一些资料提到默认值为 151 。 最大允许值&#xff1a; MySQL 的最大…

ant-design-vue:a-table表格中插入自定义按钮

本文将介绍如何使用ant-design-vue在a-table表格中加入自定义按钮和图标的代码。 结果如下图所示&#xff0c; 一、简单示例 <template><a-table:columns"columns":data-source"data":row-selection"rowSelection":ellipsis"tru…

对称密码学

1. 使用OpenSSL 命令行 在 Ubuntu Linux Distribution (发行版&#xff09;中&#xff0c; OpenSSL 通常可用。当然&#xff0c;如果不可用的话&#xff0c;也可以使用下以下命令安装 OpenSSL: $ sudo apt-get install openssl 安装完后可以使用以下命令检查 OpenSSL 版本&am…

深度学习基础案例4--构建CNN卷积神经网络实现对猴痘病的识别(测试集准确率86.5%)

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 前言 下一周会很忙&#xff0c;更新可能不及时&#xff0c;请大家见谅这个项目我感觉是一个很好的入门案例&#xff0c;但是自己测试的时候测试集准确率只比较…