21xrx.com
2024-12-23 03:08:57 Monday
登录
文章检索 我的文章 写文章
Java EasyExcel 实现大量数据分批写入Excel
2023-06-15 15:42:28 深夜i     --     --
Java EasyExcel

Java EasyExcel 实现大量数据分批写入Excel

Java EasyExcel 是一个基于 POI 封装的 Java Excel 工具类,能够快速方便地读取、写入 Excel 文件。但是,如果写入的数据量很大,会出现内存不足的问题。怎么办呢?今天我们就来看看如何通过 Java EasyExcel 实现大量数据的分批写入 Excel。

首先,我们需要将写入的数据进行分批。比如我们要写入 10000 条数据,就可以将它分为 10 个批次,每批写入 1000 条数据。这样就可以避免一次性将所有数据读入内存,导致内存不足。

然后,可以通过设置 EasyExcel 的 WriteHandler 来实现数据的分批写入。WriteHandler 是一个事件接口,可以实现它的一些方法来控制数据写入时的一些行为。比如,我们可以实现 WriteHandler 的 sheet 方法来控制每个 Sheet 写入多少条数据。具体实现如下:


public class BatchWriteHandler implements WriteHandler {

  private int batchSize;

  public BatchWriteHandler(int batchSize)

    this.batchSize = batchSize;

  

  @Override

  public void sheet(int sheetNo, Sheet sheet) {

    sheet.setWriteHead(true);

    sheet.setClazz(Data.class);

    sheet.setUse1904windowing(false);

  }

  @Override

  public void row(int rowNum, List rowData)

    // do nothing

  

  @Override

  public void cell(int cellNum, Cell cell)

    // do nothing

  

  @Override

  public void end()

    // do nothing

  

}

在 BatchWriteHandler 中,我们重写了 sheet 方法,设置了 Sheet 的头部、数据类型和日期格式等。然后,在 write 方法中,我们在每个 Sheet 写入 batchSize 条数据,并且关闭当前 Sheet 以便写入下一个 Sheet。

最后,我们只需要在 EasyExcel 的 write 方法中设置 WriteHandler 就可以实现分批写入了,具体代码如下:


  

public class EasyExcelUtil {

  public static void writeExcel(String filePath, List dataList, int batchSize) {

    try {

      FileOutputStream fos = new FileOutputStream(filePath);

      ExcelWriter excelWriter = new ExcelWriter(fos, ExcelTypeEnum.XLSX);

      WriteSheet writeSheet = EasyExcel.writerSheet(0).build();

      WriteHandler writeHandler = new BatchWriteHandler(batchSize);

      excelWriter.registerWriteHandler(writeHandler);

      excelWriter.write(dataList, writeSheet);

      excelWriter.finish();

      fos.close();

    } catch (Exception e) {

      e.printStackTrace();

    }

  }

}

以上就是 Java EasyExcel 实现大量数据分批写入 Excel 的方法。通过设置 WriteHandler 和分批写入来解决大量数据写入 Excel 时内存不足的问题。

、分批写入、Excel 文件

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复