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);
    }
  

  

posted @   90的生力军  阅读(112)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示