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.xdnf.cn/news/1536864.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

SysML图例-农业无人机

DDD领域驱动设计批评文集>> 《软件方法》强化自测题集>> 《软件方法》各章合集>>

dll修复工具4DDiG DLL Fixer,解决电脑dll丢失问题

4DDiG DLL Fixer是一款专业的DLL修复工具&#xff0c;旨在解决Windows系统中各种DLL相关问题。该工具能够快速全面地扫描计算机&#xff0c;检测并修复导致程序功能异常的DLL错误。它支持一键式操作&#xff0c;自动扫描、识别和替换缺失或损坏的DLL文件&#xff0c;从而帮助用…

推荐3款AIai论文大纲一键生成文献,精选整理!

在当前的学术写作环境中&#xff0c;AI论文大纲生成工具已经成为许多学者和学生的重要助手。这些工具不仅能够快速生成高质量的论文大纲&#xff0c;还能提供内容填充、文献引用和查重修改等全方位的服务。以下是三款值得推荐的AI论文大纲一键生成文献工具&#xff1a;千笔-AIP…

爬虫--翻页tips

免责声明&#xff1a;本文仅做分享&#xff01; 伪线程 from DrissionPage import ChromiumPage import timepage ChromiumPage() page.get("https://you.ctrip.com/sight/taian746.html") # 初始化 第0页 index_page 0# 翻页点击函数 sleep def page_turn():page…

C/C++语言基础--从C到C++的不同(下),15个部分说明C与C++的不同

本专栏目的 更新C/C的基础语法&#xff0c;包括C的一些新特性 前言 1-10在上篇C/C语言基础–从C到C的不同(上&#xff09;&#xff1b;当然C和C的不同还有很多&#xff0c;本人暂时只总结这些&#xff0c;其他的慢慢更新&#xff1b;上一篇C/C语言基础–从C到C的不同(上&…

node.js 中的进程和线程工作原理

本文所有的代码均基于 node.js 14 LTS 版本分析 概念 进程是对正在运行中的程序的一个抽象&#xff0c;是系统进行资源分配和调度的基本单位&#xff0c;操作系统的其他所有内容都是围绕着进程展开的 线程是操作系统能够进行运算调度的最小单位&#xff0c;其是进程中的一个执…

康养小站:长者舒缓疼痛的港湾

【导语】在老龄化日益加剧的当下&#xff0c;如何关爱和照顾好长者&#xff0c;成为社会关注的焦点。近日&#xff0c;笔者走进深圳宝安区一家专注于长者康养的社区小站&#xff0c;探访它如何帮助长者缓解疼痛&#xff0c;提高生活质量。 随着我国人口老龄化问题日益显著&…

算法:30.串联所有单词的子串

题目 链接&#xff1a;leetcode链接 思路分析&#xff08;滑动窗口&#xff09; 这道题目类似寻找异位词的题目&#xff0c;我认为是寻找异位词的升级版 传送门:寻找异位词 为什么说像呢&#xff1f; 注意&#xff1a;这道题目中words数组里面的字符串长度都是相同的&…

[JAVA]介绍怎样在Java中通过字节字符流实现文件读取与写入

一&#xff0c;初识File类及其常用方法 File类是java.io包下代表与平台无关的文件和目录&#xff0c;程序中操作文件和目录&#xff0c;都可以通过File类来完成。 通过这个File对象&#xff0c;可以进行一系列与文件相关的操作&#xff0c;比如判断文件是否存在&#xff0c;获…

Java毕业设计 基于SpringBoot和Vue药店管理系统

Java毕业设计 基于SpringBoot和Vue药店管理系统 这篇博文将介绍一个基于SpringBoot框架和Vue开发的药店管理系统&#xff0c;适合用于Java毕业设计。 功能介绍 首页 图片轮播 登录 注册 药品信息 药品详情 评论 收藏 购买 添加到购物车 用药指南 公告资讯 购物车 …

在深圳停车场我居然能看到很漂亮的瓦房

石岩街道在宝安确实是小透明哈&#xff0c;从市区搬到石岩快4年了&#xff0c;确实这里的建筑特别像老家的感觉&#xff0c;马路很狭窄。如果是开车的话&#xff0c;我是不会进入罗租大道来着&#xff0c;人车太复杂。由于上屋社区适合儿童的室内场所太少了&#xff0c;石岩这块…

python之模块和包的导入与使用,pip的使用(13)

文章目录 1、模块1.1 模块的分类1.1.1 内置模块1.1.2 第三方模块&#xff08;比较重要&#xff09;1.1.3 自定义模块 1.2 模块的导入1.2.1 单个模块的导入1.2.2 同时导入多个模块1.2.3 模块导入规范1.2.4 给导入的模块取别名1.2.5 同时导入模块和名字1.2.6 给导入的名字取别名扩…

【Python机器学习】序列到序列建模——使用序列到序列网络构建一个聊天机器人

为了寻聊天机器人&#xff0c;下面使用康奈尔电影对话语料库训练一个序列到序列的网络来“适当的”湖大问题或语句。以下聊天机器人示例采用的是Keras blog中的序列到序列的示例。 为训练准备语料库 首先&#xff0c;需要加载语料库并从中生成训练集&#xff0c;训练数据将决…

【刷题】Day5--数字在升序数组中出现的次数

Hi! 今日份刷题~ 数字在升序数组中出现的次数_牛客题霸_牛客网 我感觉题目简单&#xff0c;我的解答也很简单&#xff0c;二分法遗忘&#xff0c;有时间复习一下尝试新的解法。 /*** 代码中的类名、方法名、参数名已经指定&#xff0c;请勿修改&#xff0c;直接返回方法规定的…

electron-updater实现electron全量版本更新

在 Electron 应用中使用 electron-updater 来实现自动更新功能时&#xff0c;通常你会在一个专门的模块或文件中管理更新逻辑。如果你想要使用 ES6 的 import 语法来引入 electron-updater&#xff0c;你需要确保你的项目已经配置好了支持 ES6 模块的构建工具&#xff08;如 We…

系统指标优化 Stream流 API使用及源码分析

java 8 Stream流 api 使用 &#xff08;1&#xff09;集合筛选&#xff0c;为什么此处要使用 Collectors.toMap 加 Function.identity() 的方式&#xff0c;而不使用简单的filter过滤呢&#xff1f; Stream流 API 代码: collect(Collectors.toMap(GoldTagResponse::getValue, …

C语言深入理解指针(一)

目录 内存和地址内存编址的理解 指针变量和地址取地址操作符&#xff08;&&#xff09;指针变量和解引用操作符&#xff08;*&#xff09;指针变量如何拆解指针类型解引用操作符 指针变量的大小 指针变量类型的意义指针的解引用指针-整数 const修饰指针const修饰变量const修…

多态的相关知识

一.多态的概念 1.多态&#xff1a;多态是⼀个继承关系的下的类对象&#xff0c;去调⽤同⼀函数&#xff0c;产⽣了不同的⾏为。 2.多态分为编译时多态(静态多态)和运⾏时多态(动态多态)。 1>编译时多态(静态多态)主要就是函数重载和函数模板&#xff0c;他们传不同类型的…

Datawhale------Tiny-universe学习笔记——Qwen

1. Qwen整体介绍 对于一个完全没接触过大模型的小白来说&#xff0c;猛一听这个名字首先会一懵&#xff1a;Qwen是啥。这里首先解答一下这个问题。下面是官网给出介绍&#xff1a;Qwen是阿里巴巴集团Qwen团队研发的大语言模型和大型多模态模型系列。其实随着大模型领域的发展&a…

庆祝中华人民共和国成立75周年答题活

为庆祝中华人民共和国成立75周年&#xff0c;弘扬爱国主义精神&#xff0c;激发广大党员干部和人民群众奋进新征程、建功新时代&#xff0c;奋力推进中国式现代化建设的爱国热情&#xff0c;“学习强国”学习平台采用“线上答题线下竞赛”的形式&#xff0c;举办“学习强国 强国…