如何高效导入百万级数据?使用easyexcel!

一、什么是easyexcel?

EasyExcel是一个操作Excel的Java工具,主要用于读写大量数据时提高效率。它采用了基于流的操作方式,大大减少了内存消耗以及GC的次数。而且EasyExcel还有一些方便实用的功能,比如导出模板、数据校验等等。

二、为什么选择easyexcel?

在处理大量Excel数据时,传统的POI操作方式会出现诸多问题。因为POI需要一次性将整个Excel文件读入内存,如果excel文件过大,就会出现内存溢出导致程序崩溃。而easyexcel则通过内部自定义的回调方式,可以避免过多存储Excel数据而占用过多的内存。

而且EasyExcel还支持多种格式的数据导入和导出,包括Excel、Csv、Pdf和Html等等。这些功能都使得easyexcel成为处理Excel数据的首选工具。

三、如何使用easyexcel导入百万级数据?

我们来看一个简单的示例:

public void readExcel(){
    InputStream inputStream = null;
    try {
        inputStream = new FileInputStream("test.xlsx");
        // 构建读取实体类
        ExcelListener listener = new ExcelListener();
        ExcelReader excelReader = new ExcelReader(inputStream, null, listener);
        excelReader.read();
        List<Object> list = listener.getList();
        // TODO: 对数据进行处理
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } finally {
        try {
            inputStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

上述代码中,我们通过创建一个ExcelReader对象,然后传入Excel数据流、读取sheet的索引以及自定义的ExcelListener类实例。然后调用read()方法就可以读取到Excel文件中的所有数据。

但是实际上,我们一般不会将所有数据都读取到内存中,因为这样会占用大量内存并且运行缓慢。而是将数据分批读取,每次读取一定量的数据到内存中进行处理,然后再读取下一批数据。这样可以使得程序处理速度更快而且更加稳定。

下面是一个使用easyexcel分批读取百万级数据的示例代码:

public void batchReadExcel() {
    InputStream inputStream = null;
    try {
        inputStream = new FileInputStream("test.xlsx");
        ExcelListener listener = new ExcelListener();
        // 批量处理数据每次读取1000条数据
        AnalysisEventListener<Object> batchListener = new AnalysisEventListener<Object>() {

            private static final int BATCH_COUNT = 1000;
            // 自定义数据处理逻辑, 每读取1000条数据进行一次处理
            List<Object> list = new ArrayList<Object>(BATCH_COUNT);
            public void invoke(Object object, AnalysisContext context) {
                list.add(object);
                if (list.size() >= BATCH_COUNT) {
                    // TODO: 对数据进行处理
                    list.clear();
                }
            }

            public void doAfterAllAnalysed(AnalysisContext context) {
                // TODO: 处理最后一次的数据
            }
        };

        ExcelReaderBuilder excelReaderBuilder = new ExcelReaderBuilder();
        ExcelReader excelReader = excelReaderBuilder
            .file(inputStream)
            .readAll()
            .headRowNumber(1)
            .excelType(ExcelTypeEnum.XLSX)
            .registerReadListener(batchListener)
            .build();
        excelReader.read();
    } catch (FileNotFoundException e) {
        // TODO: 异常处理
    } finally {
        try {
            inputStream.close();
        } catch (IOException e) {
            // TODO: 异常处理
        }
    }
}

在上述代码中,我们首先创建了一个批量处理的监听器,每次处理一定量的数据。然后通过ExcelReaderBuilder来创建ExcelReader实例,将输入流、读取所有sheet、指定Excel类型、批量处理监听器传入ExcelReaderBuilder中,最后调用build()方法创建ExcelReader实例,并调用read()方法进行读取。

四、如何实现数据校验?

EasyExcel内置了一些常用的数据校验功能。对于一些特殊的校验需求,可以通过继承EasyExcel内置的ConstraintValidator实现自定义校验规则。

下面是一个实现数据校验的示例代码:

public class ExcelListener extends AnalysisEventListener<Object> {

    private List<Object> list = new ArrayList<Object>();

    // 继承ConstraintValidator并实现自定义校验规则
    private ConstraintValidator constraintValidator;

    public ExcelListener(ConstraintValidator constraintValidator) {
        this.constraintValidator = constraintValidator;
    }

    @Override
    public void invoke(Object object, AnalysisContext context) {
        if(constraintValidator != null) {
            // 在读取Excel文件之前,对数据进行校验
            constraintValidator.validate(object);
        }
        list.add(object);
    }
    // 省略getter、setter方法
}

上述代码中,我们通过继承EasyExcel的AnalysisEventListener实现对Excel数据的监听。在invoke()方法中,我们可以将读取到的数据进行校验,然后将校验通过后的数据加入到列表中。

下面是一个自定义校验规则的示例代码:

public class CustomConstraintValidator implements ConstraintValidator {

    @Override
    public void validate(Object o) throws Exception {
        // TODO: 自定义校验逻辑
    }

    @Override
    public void addCondition(Condition condition) {

    }

    @Override
    public void init() {

    }

    @Override
    public void setParameters(Map<String, Object> map) {

    }

    @Override
    public void close() throws IOException {

    }
}

五、如何导出Excel数据到文件?

EasyExcel同样支持从Java对象中导出数据到Excel文件中,操作非常简单,只需要调用EasyExcel的write()方法,并传入数据和文件保存路径即可。

下面是一个导出Excel的示例代码:

public void writeExcel() {
    OutputStream outputStream = null;
    try {
        outputStream = new FileOutputStream("test.xlsx");

        // 准备导出数据
        List<Object> list = new ArrayList<Object>();
        // TODO: 添加数据到列表中

        // 导出Excel文件
        ExcelWriter excelWriter = EasyExcel.write(outputStream).build();
        WriteSheet writeSheet = EasyExcel.writerSheet(0, "Sheet1").head(Object.class).build();
        excelWriter.write(list, writeSheet);
    } catch (IOException e) {
        // TODO: 异常处理
    } finally {
        try {
            outputStream.close();
        } catch (IOException e) {
            // TODO: 异常处理
        }
    }
}

上述代码中,我们首先创建一个输出流,然后准备要导出的数据,并创建ExcelWriter实例。调用EasyExcel的静态方法write(),并传入输出流即可实现创建ExcelWriter实例的功能。然后通过调用EasyExcel的writerSheet()方法来创建WriteSheet实例,并指定sheet的名称和要导出的数据类型,然后将数据和WriteSheet传入ExcelWriter的write()方法即可实现Excel数据的导出。

原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/301927.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
小蓝小蓝
上一篇 2024-12-30 16:10
下一篇 2024-12-30 16:10

相关推荐

  • Python利用级数计算圆周率

    本文将详细介绍Python利用级数计算圆周率的方法,旨在帮助Python开发者更好地理解级数原理。 一、Leibniz公式计算圆周率 Leibniz公式是一种基于级数的求圆周率的方…

    编程 2025-04-28
  • Python莱布尼兹级数

    Python莱布尼兹级数是一种在计算机领域中使用的数学算法,可以在Python中准确地计算圆周率的值。本文将从多个方面对这一算法进行详细讲解,希望能够帮助读者更好地理解和应用这一算…

    编程 2025-04-28
  • Trocket:打造高效可靠的远程控制工具

    如何使用trocket打造高效可靠的远程控制工具?本文将从以下几个方面进行详细的阐述。 一、安装和使用trocket trocket是一个基于Python实现的远程控制工具,使用时…

    编程 2025-04-28
  • Python生成列表最高效的方法

    本文主要介绍在Python中生成列表最高效的方法,涉及到列表生成式、range函数、map函数以及ITertools模块等多种方法。 一、列表生成式 列表生成式是Python中最常…

    编程 2025-04-28
  • TFN MR56:高效可靠的网络环境管理工具

    本文将从多个方面深入阐述TFN MR56的作用、特点、使用方法以及优点,为读者全面介绍这一高效可靠的网络环境管理工具。 一、简介 TFN MR56是一款多功能的网络环境管理工具,可…

    编程 2025-04-27
  • 用Pythonic的方式编写高效代码

    Pythonic是一种编程哲学,它强调Python编程风格的简单、清晰、优雅和明确。Python应该描述为一种语言而不是一种编程语言。Pythonic的编程方式不仅可以使我们在编码…

    编程 2025-04-27
  • Python生成10万条数据的高效方法

    本文将从以下几个方面探讨如何高效地生成Python中的10万条数据: 一、使用Python内置函数生成数据 Python提供了许多内置函数可以用来生成数据,例如range()函数可…

    编程 2025-04-27
  • Gino FastAPI实现高效低耗ORM

    本文将从以下多个方面详细阐述Gino FastAPI的优点与使用,展现其实现高效低耗ORM的能力。 一、快速入门 首先,我们需要在项目中安装Gino FastAPI: pip in…

    编程 2025-04-27
  • 如何利用字节跳动推广渠道高效推广产品

    对于企业或者个人而言,推广产品或者服务是必须的。如何让更多的人知道、认识、使用你的产品是推广的核心问题。而今天,我们要为大家介绍的是如何利用字节跳动推广渠道高效推广产品。 一、个性…

    编程 2025-04-27
  • 如何制作高效的目标识别数据集

    对于机器学习中的目标识别任务来说,制作高质量的数据集对于训练模型十分重要。本文将从数据收集、数据标注、数据增强等方面阐述如何制作高效的目标识别数据集。 一、数据收集 在制作目标识别…

    编程 2025-04-27

发表回复

登录后才能评论