当前位置: 首页 > news >正文

SpringBoot中使用EasyExcel并行导出多个excel文件并压缩zip后下载

❃博主首页 : 「码到三十五」 ,同名公众号 :「码到三十五」,wx号 : 「liwu0213」
☠博主专栏 : <mysql高手> <elasticsearch高手> <源码解读> <java核心> <面试攻关>
♝博主的话 : 搬的每块砖,皆为峰峦之基;公众号搜索「码到三十五」关注这个爱发技术干货的coder,一起筑基

背景

SpringBoot的同步导出方式中,服务器会阻塞直到Excel文件生成完毕,在处理大量数据的导出功能,利用CompletableFuture,我们可以将导出任务异步化,最后 这些文件进一步压缩成ZIP格式以方便下载:

DEMO代码:

@RestController
@RequestMapping("/export")
public class ExportController {@Autowiredprivate ExcelExportService excelExportService;@GetMapping("/zip")public ResponseEntity<byte[]> exportToZip() throws Exception {List<List<Data>> dataSets = multipleDataSets();List<CompletableFuture<String>> futures = new ArrayList<>();// 异步导出所有Excel文件String outputDir = "path/to/output/dir/";for (List<Data> dataSet : dataSets) {futures.add(excelExportService.exportDataToExcel(dataSet, outputDir));}// 等待所有导出任务完成       CompletableFuture.allOf(futures.toArray(CompletableFuture[]::new)).get(10, TimeUnit.MINUTES);;// 收集Excel文件路径List<String> excelFilePaths = futures.stream().map(CompletableFuture::join) // 获取文件路径.collect(Collectors.toList());// 压缩文件File zipFile = new File("path/to/output.zip");try (ZipOutputStream zipOut = new ZipOutputStream(new FileOutputStream(zipFile))) {for (String filePath : excelFilePaths) {zipFile(new File(filePath), zipOut, new File(filePath).getName());}}// 返回ZIP文件byte[] data = Files.readAllBytes(zipFile.toPath());return ResponseEntity.ok().header("Content-Disposition", "attachment; filename=\"" + zipFile.getName() + "\"").contentType(MediaType.parseMediaType("application/zip")).body(data);}// 将文件添加到ZIP输出流中  private void zipFile(File file, ZipOutputStream zipOut, String entryName) throws IOException {  try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file))) {  ZipEntry zipEntry = new ZipEntry(entryName);  zipOut.putNextEntry(zipEntry);  byte[] bytesIn = new byte[4096];  int read;  while ((read = bis.read(bytesIn)) != -1) {  zipOut.write(bytesIn, 0, read);  }  zipOut.closeEntry();  }  } // 获取数据private List<List<Data>> multipleDataSets() {}
}

SpringBoot异步并行生成excel文件,利用EasyExcel库来简化Excel的生成过程:

@Service
public class ExcelExportService {private static final String TEMPLATE_PATH = "path/to/template.xlsx";@Autowiredprivate TaskExecutor taskExecutor; public CompletableFuture<Void> exportDataToExcel(List<Data> dataList, String outputDir) {Path temproaryFilePath = Files.createTempFile(outputDir, "excelFilePre",".xlsx");return CompletableFuture.runAsync(() -> {try (OutputStream outputStream = new FileOutputStream(temproaryFilePath )) {EasyExcel.write(outputStream, Data.class).withTemplate(TEMPLATE_PATH).sheet().doFill(dataList).finish();return temproaryFilePath.toString();} catch (IOException e) {throw new RuntimeException("Failed to export Excel file", e);}}, taskExecutor);}
}

关注公众号[码到三十五]获取更多技术干货 !


http://www.mrgr.cn/news/28337.html

相关文章:

  • 用WordPress需要学习哪些编程知识
  • RHCE的学习(17)
  • unittest和pytest
  • Python学习26天
  • SPIRiT-Diffusion:基于自一致性驱动的加速MRI扩散模型|文献速递-基于深度学习的病灶分割与数据超分辨率
  • Leecode刷题C语言之最少翻转次数使二进制矩阵回文①
  • Gradio 中如何让 Chatbot 自动滚动
  • 来重庆工作2年,想念广东了
  • AI替代插画师跟设计师?不用焦虑!
  • MOE论文汇总
  • 【最新华为OD机试E卷-支持在线评测】最长连续子序列(100分)多语言题解-(Python/C/JavaScript/Java/Cpp)
  • 公路数据集、桥梁数据集、隧道数据集、地铁数据集、水坝数据集、挡土墙数据集
  • 达芬奇竖屏导出有黑屏解决方案
  • cad2015以上默认设置
  • JAVA算法数据结构第一节稀疏矩阵
  • Python数据分析-世界上最富有的1000人
  • re题(21)BUUCTF—findit
  • 除了C# 、C++,C++ cli 、还有一个Java版的 db
  • 面试官问:请描述一次你成功解决问题的经历?
  • c++ #include <cmath>介绍
  • centos更改静态ip
  • 面试官问:你在团队中的角色是什么?
  • Vue3+Element Plus:使用el-dialog,对话框可拖动,且对话框弹出时仍然能够在背景页(对话框外部的页面部分)上进行滚动以及输入框输入信息
  • 一个有趣的“苦无”测试探针笔的设计
  • Python Pyvis库创建交互式网络图 高级功能详解
  • 【Python基础】Python 装饰器(优雅的代码增强工具)