首页 > 其他分享 >Excel多线程导出大数据量

Excel多线程导出大数据量

时间:2023-03-10 09:44:44浏览次数:41  
标签:filePath Excel List header 导出 数据量 多线程 data

以下是Java的EasyExcel API实现多线程Excel导出的demo。

在这个demo中,我们使用EasyExcel API来导出Excel文件。我们将表头和内容定义为动态的,以便能够处理大量的数据。

我们将使用Executor框架来实现多线程操作。这将大大提高处理数据的效率。

首先,我们需要定义表头和数据模型对象。这些模型对象将保存Excel文件中的数据。

代码示例:

public class ExcelModel {

  @ExcelProperty("ID")
  private Long id;

  @ExcelProperty("Name")
  private String name;

  // getters and setters
}

public class ExcelHeader {

  private List<String> headers;

  public ExcelHeader(List<String> headers) {
    this.headers = headers;
  }

  // getter and setter
}

接下来,我们需要编写一个导出线程,这个线程将根据传入的表头和数据模型对象来导出Excel文件。

代码示例:

public class ExcelExportTask implements Runnable {

  private final String filePath;
  private final List<ExcelModel> data;
  private final ExcelHeader header;

  public ExcelExportTask(String filePath, List<ExcelModel> data, ExcelHeader header) {
    this.filePath = filePath;
    this.data = data;
    this.header = header;
  }

  @Override
  public void run() {
    try {
      OutputStream outputStream = new FileOutputStream(filePath);
      ExcelWriter excelWriter = new ExcelWriter(outputStream, ExcelTypeEnum.XLSX);

      WriteSheet writeSheet = EasyExcel.writerSheet().build();
      // 写入表头 List<List<String>> headList = new ArrayList<>();
      headList.add(header.getHeaders());
      excelWriter.write0(headList, writeSheet);

      // 写入数据
      List<List<Object>> dataList = new ArrayList<>();
      for (ExcelModel excelModel : data) {
        List<Object> rowData = new ArrayList<>();
        rowData.add(excelModel.getId());
        rowData.add(excelModel.getName());
        dataList.add(rowData);
      }

      excelWriter.write0(dataList, writeSheet);
      excelWriter.finish();
      outputStream.close();
    } catch (IOException e) {
      e.printStackTrace();
    }
  }
}

在这个线程中,我们使用Java的输出流来创建ExcelWriter对象并写入表头和数据。然后,我们将ExcelWriter对象关闭并关闭输出流。

最后,我们需要编写导出的代码,并使用Executor框架来启动多线程。

代码示例:

public class ExcelExportUtil {

  private static final int THREAD_COUNT = 5;

  public static void exportExcel(String filePath, List<ExcelModel> data, ExcelHeader header)
      throws InterruptedException {
    ExecutorService executorService = Executors.newFixedThreadPool(THREAD_COUNT);
    List<List<ExcelModel>> dataList = Lists.partition(data, data.size() / THREAD_COUNT);
    for (List<ExcelModel> subList : dataList) {
      executorService.execute(new ExcelExportTask(filePath, subList, header));
    }
    executorService.shutdown();
    executorService.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS);
  }
}

在这个类中,我们先将数据分成几个子列表,然后使用Executor框架来启动多个导出线程。

这将大大提高处理大量数据的效率。

可以使用以下代码调用导出方法:

String filePath = "test.xlsx";
List<ExcelModel> data = fetchData();
ExcelHeader header = new ExcelHeader(Arrays.asList("ID", "Name"));
ExcelExportUtil.exportExcel(filePath, data, header);

在这个示例中,我们将文件路径、数据、表头传递给导出工具类。工具类将启动多个线程来导出Excel文件。

使用此方法,我们可以轻松地从大量数据中导出Excel文件。

标签:filePath,Excel,List,header,导出,数据量,多线程,data
From: https://www.cnblogs.com/Roni-i/p/17202316.html

相关文章

  • java中的特殊文件、日志技术、多线程入门
    一,属性文件(.properties)1,特殊文件概述(必会)我们知道IO流是用来读数据,目的是为了获取其中的信息供我们使用,但是普通的txt文件是杂乱无章的,除非我们规定,自己写。虽然可以但......
  • JUC(四)多线程锁
    目录多线程锁Synchronized锁的八种情况公平锁和非公平锁可重入锁synchronizedLock死锁检查死锁多线程锁Synchronized锁的八种情况以一个手机类为例,包含两个synchronized......
  • Linux高并发服务器之Linux多线程开发
    本文源自C++高薪面试项目的学习笔记,主要记录Liunx多线程的学习,主要知识点是线程概述等基础概念以外,还有线程相关Liunx系统函数以及对应练手代码,除此之外还有线程同步问题的......
  • CAD表格怎么转换成Excel表格?CAD表格转EXCEL步骤
    无论是建筑行业还是机械行业,设计师在CAD制图过程中会将项目重要数据以表格的形式插入到图纸中,常见的CAD表格有明细表、工序卡、图样目录等。可是CAD表格在进行数据查找的时......
  • JAVA 实现导入导出Excel-03随笔
    还是摸鱼的一天疯狂星期四的舆论越来越少了,于我而言:KFC并没有特别价值值得众人去推崇和关注的地方到公司打完卡之后,"偷偷"跑下楼吃了一份早餐,又"偷偷"的做在工位上,看见......
  • 将excel表中A列值相同的B列值进行拼接
    原始表格第一步,将B列和C列的值合并(1)用等于号合并两列,下拉(2)复制粘贴,只粘贴数值以清除单元格公式,删除多余的列第二步,将A列值相同的B列值以逗号拼接点击查看代码imp......
  • 合并同一个目录下的多张excel表
    目的将同一目录下的表格1和表格2合并到一张新表new_file.xlsx中目录如下合并操作的代码如下点击查看代码importpandasaspdimportos#文件路径file_dir=r'......
  • # yyds干货盘点 # 大佬们帮我看看怎么输出到Excel中是空的?
    大家好,我是皮皮。一、前言前几天在Python铂金交流群【JethroShen】问了一个​​Python​​自动化处理的问题,这里拿出来给大家分享下。代码如下:importpandasaspdimportc......
  • JAVA多线程处理大量数据
    背景说明:要对服务器上一个目录进行全量文件读取,采用传统的单线程性能较差,耗时严重。1、多线程执行类--FileThreadUtils.javaimportcn.hutool.core.collection.CollUtil......
  • excel 合并
    最近整理收钱吧的账单明细,因为收钱吧限制每次最多只能导出1个月的明细,所以我需要合并这些零零碎碎的表格,方便在excel中做统计筛选#!/usr/bin/envpython3#coding:u......