使用 EasyExcel 高效读取大文件 Excel

news/2024/9/15 3:35:56 标签: 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> {

    @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.niftyadmin.cn/n/5635239.html

相关文章

World of Warcraft [CLASSIC][80][Grandel] Call to Arms: Warsong Gulch

Call to Arms: Warsong Gulch - Quest - 魔兽世界怀旧服CTM4.34《大地的裂变》数据库_大灾变85级魔兽数据库_ctm数据库 10人PVP战歌峡谷&#xff0c;该战场经常用来互刷军衔和荣誉&#xff0c;哈哈 wow plugin_魔兽世界挂机插件-CSDN博客

向量和矩阵学习笔记

向量和矩阵学习笔记 Ps:因为本人实力有限&#xff0c;有一部分可能不太详细&#xff0c;若有补充评论区回复&#xff0c;QWQ 向量 向量的定义 首先&#xff0c;因为我刚刚学到高中的向量&#xff0c;对向量的看法呢就是一条有长度和方向的线&#xff0c;不过这在数学上的定…

QT高级控件

目录 一、引言 二、QT高级控件概述 三、QT高级控件应用实例 1.QTableView应用实例 2.QTreeView应用实例 3.QTabWidget应用实例 四、总结 本文将带领大家了解QT高级控件的使用方法&#xff0c;并通过实例讲解如何在实际项目中运用这些控件&#xff0c;提高程序界面的美观性和…

qt实现三原色滑动条变色

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

74. 搜索二维矩阵算法实现详解

LeetCode 74. 搜索二维矩阵详解 一、题目描述 给你一个满足下述两条属性的 m x n 整数矩阵: 每行中的整数从左到右按非严格递增顺序排列。每行的第一个整数大于前一行的最后一个整数。给你一个整数 target,如果 target 在矩阵中,返回 true;否则,返回 false。 示例 1: …

线性代数|机器学习-P32循环矩阵的特征向量-傅里叶矩阵

文章目录 1. 大纲2. 循环矩阵2.1 移位矩阵P2.2 P的特征值和特征向量2.3 循环卷积矩阵2.4 循环卷积计算 3. 傅里叶矩阵 1. 大纲 循环矩阵在机器学习&#xff0c;图像处理中的应用循环卷积矩阵的特征值&#xff0c;特征向量&#xff0c;卷积规则循环卷积矩阵多项式表达&#xff…

sqlite3的db.serialize方法:确保数据库操作串行化的利器

在Node.js中&#xff0c;sqlite3是一个广受欢迎的轻量级数据库库&#xff0c;它提供了一个简洁的API来与SQLite数据库进行交互。在进行数据库操作时&#xff0c;为了确保操作的串行化执行&#xff0c;避免并发问题&#xff0c;sqlite3提供了db.serialize方法。本文将深入解析db…

开放题:如何利用深度学习来重参数化 K-means 聚类,这样的思路要做出效果,它的前向传播、反向传播以及优化目标最好是什么样的?

&#x1f349; CSDN 叶庭云&#xff1a;https://yetingyun.blog.csdn.net/ 传统的 K-means 算法直接处理数据点与聚类中心。重参数化技术的核心在于利用神经网络来学习一个从输入空间映射到聚类分配的转换函数。深度学习重参数化 K-means 聚类的核心思想在于&#xff0c;将传统…