首页 > 其他分享 >SpringBoot中使用EasyExcel并行导出多个excel文件并压缩zip后下载

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

时间:2024-09-24 16:55:20浏览次数:10  
标签:Excel SpringBoot zip zipFile EasyExcel List zipOut CompletableFuture new


❃博主首页 : 「码到三十五」 ,同名公众号 :「码到三十五」
♝博主的话 : 搬的每块砖,皆为峰峦之基;公众号搜索「码到三十五」关注这个爱发技术干货的coder,一起筑基



背景

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

DEMO代码:

@RestController
@RequestMapping("/export")
public class ExportController {

    @Autowired
    private 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";

    @Autowired
    private 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);
    }
}

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


标签:Excel,SpringBoot,zip,zipFile,EasyExcel,List,zipOut,CompletableFuture,new
From: https://blog.51cto.com/u_16542656/12100904

相关文章

  • 基于Node.js+vue基于Springboot恒生蔬菜库存管理系统(开题+程序+论文) 计算机毕业设计
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容研究背景随着农业现代化进程的加速和消费者对食品新鲜度、安全性的日益重视,蔬菜库存管理成为了农产品供应链中至关重要的一环。传统的手工记录与管理方式已难以满足......
  • springboot项目打包部署到linux运行经验:
    打包:1.mvn:clean2.mvn:package 生成的snapshop-jar包在target下。部署(采用idea自带的ftp) 1.idea的tools-deployment中配置虚拟机的连接,包括用户名,密码,端口 2.配置idea的mapping文件目录映射(随便写),就可以打开虚拟机目录了 3.将idea的target下生产的jar包直接拖动到虚......
  • 基于Java+Springboot+Vue开发的体育用品商城管理系统源码+开发文档
    项目简介该项目是基于Java+Springboot+Vue开发的体育用品商城管理系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Java编程技能,同时锻炼他们的项目设计与开发能力。通过学习基于Java的体育用品商城管理系统项目,大学生可以在实践中学习和......
  • 基于Java+Springboot+Vue开发的体育场馆预约管理系统源码+开发文档
    项目简介该项目是基于Java+Springboot+Vue开发的体育场馆预约管理系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Java编程技能,同时锻炼他们的项目设计与开发能力。通过学习基于Java的体育场馆管理系统项目,大学生可以在实践中学习和提升......
  • 基于Java+Springboot+Vue开发的旅游景区管理系统源码+参考文章1.3万字
    项目简介该项目是基于Java+Springboot+Vue开发的旅游景区管理系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Java编程技能,同时锻炼他们的项目设计与开发能力。通过学习基于Java的旅游景区管理系统项目,大学生可以在实践中学习和提升自己......
  • 基于Java+Springboot+Vue开发的鲜花商城管理系统源码+参考文章1.3万字
    项目简介该项目是基于Java+Springboot+Vue开发的鲜花商城管理系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Java编程技能,同时锻炼他们的项目设计与开发能力。通过学习基于Java的鲜花商城管理系统项目,大学生可以在实践中学习和提升自己......
  • 【SpringBoot】@Validated @Valid 参数校验概述以及使用方式
    1 前言最近在思考SpringBoot中的参数校验,比如我们写一段业务代码,首要的就是校验参数,单据编码空不空,数量空不空,客户空不空等,最简单的就是单独抽个方法逐个进行ifelse校验,高级点的整个校验工厂,当需要校验某种业务的时候,拿到校验器来校验,可以是简单工厂或者工厂方法都可以实......
  • springboot藏区特产销售平台系统的设计与实现
    大家好,我是永钊,一个混迹在java圈的码农,今天要和大家聊的是一款基于springboot的藏区特产销售平台系统,项目源码请联系永钊,目前有各类成品毕设javawebsshssmspringboot等等项目框架,源码丰富。专业团队,咨询就送开题报告,活动限时免费,有需要的朋友可以来留言咨询。本网站系......
  • springboot车辆充电桩系统的设计与实现
    大家好,我是永钊,一个混迹在java圈的码农,今天要和大家聊的是一款基于springboot的车辆充电桩系统,项目源码请联系永钊,目前有各类成品毕设javawebsshssmspringboot等等项目框架,源码丰富。专业团队,咨询就送开题报告,活动限时免费,有需要的朋友可以来留言咨询。本网站以springb......
  • Springboot实战——黑马点评之附近商铺
    Springboot实战——黑马点评之附近商铺1认识GEO存储1.1GEO是什么1.2GEO怎么在Redis中存储2数据库店铺导入Redis将数据库中的店铺数据按店铺类型type为关键字,分类存入Redis里数据结构:key(shop_type)--sortedSetsortedSet序列中元素组成为value(shopId)--score......