** ❃博主首页 :**
「码到三十五」
,同名公众号 :「码到三十五」,wx号 : 「liwu0213」
☠博主专栏 :
<源码解读>
<面试攻关>
♝博主的话 :搬的每块砖,皆为峰峦之基;公众号搜索「码到三十五」关注这个爱发技术干货的coder,一起筑基
背景
SpringBoot的同步导出方式中,服务器会阻塞直到Excel文件生成完毕,在处理大量数据的导出功能,利用CompletableFuture,我们可以将导出任务异步化,最后 这些文件进一步压缩成ZIP格式以方便下载:
DEMO代码:
@RestController@RequestMapping("/export")publicclassExportController{@AutowiredprivateExcelExportService excelExportService;@GetMapping("/zip")publicResponseEntity<byte[]>exportToZip()throwsException{List<List<Data>> dataSets =multipleDataSets();List<CompletableFuture<String>> futures =newArrayList<>();// 异步导出所有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 =newFile("path/to/output.zip");try(ZipOutputStream zipOut =newZipOutputStream(newFileOutputStream(zipFile))){for(String filePath : excelFilePaths){zipFile(newFile(filePath), zipOut,newFile(filePath).getName());}}// 返回ZIP文件byte[] data =Files.readAllBytes(zipFile.toPath());returnResponseEntity.ok().header("Content-Disposition","attachment; filename=\""+ zipFile.getName()+"\"").contentType(MediaType.parseMediaType("application/zip")).body(data);}// 将文件添加到ZIP输出流中 privatevoidzipFile(File file,ZipOutputStream zipOut,String entryName)throwsIOException{try(BufferedInputStream bis =newBufferedInputStream(newFileInputStream(file))){ZipEntry zipEntry =newZipEntry(entryName);
zipOut.putNextEntry(zipEntry);byte[] bytesIn =newbyte[4096];int read;while((read = bis.read(bytesIn))!=-1){
zipOut.write(bytesIn,0, read);}
zipOut.closeEntry();}}// 获取数据privateList<List<Data>>multipleDataSets(){}}
SpringBoot异步并行生成excel文件,利用
EasyExcel
库来简化Excel的生成过程:
@ServicepublicclassExcelExportService{privatestaticfinalStringTEMPLATE_PATH="path/to/template.xlsx";@AutowiredprivateTaskExecutor taskExecutor;publicCompletableFuture<Void>exportDataToExcel(List<Data> dataList,String outputDir){Path temproaryFilePath =Files.createTempFile(outputDir,"excelFilePre",".xlsx");returnCompletableFuture.runAsync(()->{try(OutputStream outputStream =newFileOutputStream(temproaryFilePath )){EasyExcel.write(outputStream,Data.class).withTemplate(TEMPLATE_PATH).sheet().doFill(dataList).finish();return temproaryFilePath.toString();}catch(IOException e){thrownewRuntimeException("Failed to export Excel file", e);}}, taskExecutor);}}
关注公众号[码到三十五]获取更多技术干货 !
版权归原作者 码到三十五 所有, 如有侵权,请联系我们删除。