您的位置:

easyexcel导入百万级数据

一、简介

easyexcel是一款基于POI封装的非常简单易用的Excel导入导出开源项目。通过使用easyexcel,我们可以快速读取和写入Excel文件,同时可以实现导入导出Excel文件的大数据量操作。

在本文当中,我们将主要阐述使用easyexcel导入百万级数据的相关知识。

二、导入百万级数据

在日常开发中,我们经常遇到需要导入大量数据的场景,而excel是最常见的数据源之一。在处理百万级数据时,我们需要关注以下几个方面:

1. 内存使用

easyexcel采用流式读取方式,可以直接从Excel文件中进行读取,不需要加载整个Excel文件到内存中。这样可以避免OOM的问题,提高系统的稳定性。而在写入时,easyexcel采用了内存映射的方式,相对于常规的直接写入或者大量追加写入,内存映射内存占用更少,并且能够提供更快的写入速度。

下面是读取百万级数据的示例代码:

public void readExcel(String filePath) {
    EasyExcel.read(filePath, MySheet.class, new MySheetListener()).sheet().headRowNumber(1).doRead();
}

public class MySheetListener extends AnalysisEventListener {
    private static final int BATCH_COUNT = 1000000;
    private List
    dataList = new ArrayList<>();

    @Override
    public void invoke(MySheet data, AnalysisContext context) {
        dataList.add(data);
        if (dataList.size() >= BATCH_COUNT) {
            saveData(dataList);
            dataList.clear();
        }
    }

    @Override
    public void doAfterAllAnalysed(AnalysisContext context) {
        saveData(dataList);
    }

    private void saveData(List
     dataList) {
        //TODO: 批量保存数据
    }
}

    
   
  

在代码中,我们通过设置BATCH_COUNT为1000000,每读取1000000条数据,就会调用一次MySheetListener的invoke()方法,并将数据加入到dataList中,最终通过saveData()方法进行批量保存。这样可以避免一次性将全部数据读取到内存中,降低内存使用的风险。

2. 读取性能

easyexcel采用了基于事件模型的读取方式,可以按照单元格顺序,逐个读取单元格数据,并通过AnalysisEventListener传递给业务逻辑处理。这样,即使是百万级别的数据,也能保证较快的读取速度。

下面是读取百万级数据的示例代码:

public void readExcel(String filePath) {
    StopWatch stopWatch = new StopWatch();
    stopWatch.start();
    EasyExcel.read(filePath, MySheet.class, new MySheetListener()).sheet().headRowNumber(1).doRead();
    stopWatch.stop();
    System.out.println(stopWatch.getTotalTimeSeconds());
}

public class MySheetListener extends AnalysisEventListener {
    private static final int BATCH_COUNT = 1000000;
    private List
    dataList = new ArrayList<>();

    @Override
    public void invoke(MySheet data, AnalysisContext context) {
        dataList.add(data);
        if (dataList.size() >= BATCH_COUNT) {
            saveData(dataList);
            dataList.clear();
        }
    }

    @Override
    public void doAfterAllAnalysed(AnalysisContext context) {
        saveData(dataList);
    }

    private void saveData(List
     dataList) {
        //TODO: 批量保存数据
    }
}

    
   
  

在代码中,我们通过StopWatch类计时,测试读取1000000条数据所需的时间。在测试数据中,读取1000000条数据的时间约为3秒,读取10000000条数据的时间约为30秒。可以看出,easyexcel在处理百万级数据时具有很好的读取性能。

3. 异常处理

在读取excel数据时,存在各种异常的情况。例如:文件不存在、文件格式不正确、读取文件过程中发生IO异常等等。针对这些情况,easyexcel提供了丰富的异常处理方式,可以有效地避免应用程序的崩溃。

下面是读取百万级数据的示例代码:

public void readExcel(String filePath) {
    try {
        EasyExcel.read(filePath, MySheet.class, new MySheetListener()).sheet().headRowNumber(1).doRead();
    } catch (Exception e) {
        System.out.println("读取Excel文件失败");
        e.printStackTrace();
    }
}

public class MySheetListener extends AnalysisEventListener {
    private static final int BATCH_COUNT = 1000000;
    private List
    dataList = new ArrayList<>();

    @Override
    public void invoke(MySheet data, AnalysisContext context) {
        dataList.add(data);
        if (dataList.size() >= BATCH_COUNT) {
            saveData(dataList);
            dataList.clear();
        }
    }

    @Override
    public void doAfterAllAnalysed(AnalysisContext context) {
        saveData(dataList);
    }

    private void saveData(List
     dataList) {
        //TODO: 批量保存数据
    }
}

    
   
  

在代码中,我们通过try{}catch{}块将读取失败的异常捕获,并输出错误信息。这样可以防止异常抛出后导致应用程序崩溃。

三、总结

本文主要介绍了easyexcel在处理百万级数据时的相关知识。通过使用easyexcel,我们可以实现快速读取和写入Excel文件,并避免OOM和性能等方面的问题。同时,easyexcel还提供了丰富的异常处理方式,能够有效地避免应用程序的崩溃。在日常开发中,我们可以根据具体场景,灵活使用easyexcel,从而使开发效率得到有效地提升。