easyexcel多sheet多线程导入示例,获取所以线程执行结果后返回
1.导入jar
1 2 3 4 5 | <dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel</artifactId> <version> 3.2 . 0 </version> </dependency> |
2.excel sheet 对应实体
1 2 3 4 5 6 7 8 9 10 11 12 13 | import com.alibaba.excel.annotation.ExcelProperty; import lombok.Data; @Data public class ModelImportExcel { @ExcelProperty (value = "名称" ,index = 0 ) private String modelName; @ExcelProperty (value = "基础算法" ,index = 1 ) private String modelType; } |
3.实现代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 | @Override public CommonResult exportAll(MultipartFile file) { // 检查文件是否为空 if (file.isEmpty()) { return CommonResult.failed( "文件为空,请重新上传!" ); } StringBuffer buffer = new StringBuffer(); try (InputStream input = file.getInputStream()) { List<ReadSheet> sheets = EasyExcel.read(input).build().excelExecutor().sheetList(); // 存储每个 CompletableFuture 的结果 List<CompletableFuture<String>> futures = new ArrayList<>(); //在开启新线程前添加如下,让子线程共享主线程servletRequestAttributes ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); RequestContextHolder.setRequestAttributes(servletRequestAttributes, true ); for (ReadSheet ss : sheets) { String sheetName = ss.getSheetName().toLowerCase(); try { //起新线程,导入基础模型 CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> { log.info( "当前线程:{}" , Thread.currentThread().getName()); switch (sheetName) { case "aaa" : exportModelaaa(file, ss, sheetName,buffer); return "" ; case "bbb" : exportModelbbb(file,ss,sheetName,buffer); return "" ; default : return "" ; } }, customExecutor); futures.add(future); continue ; } catch (Exception e) { Thread.currentThread().interrupt(); buffer.append(sheetName + " sheet,导入失败!" ); e.printStackTrace(); } } // 等待所有任务完成并获取结果 for (CompletableFuture<String> future : futures) { try { buffer.append(future.get()); // 阻塞直到任务完成并获取结果 } catch (InterruptedException | ExecutionException e) { e.printStackTrace(); } } } catch (Exception e) { e.printStackTrace(); } return CommonResult.success(buffer); } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步