Spring Boot - 异步写入多个 Excel 工作表

问题描述

我必须将数据填充到多张excel表中,由于每张表中要写入的数据很大,处理时间很慢,我需要异步写入表中

我有一个控制器,它将返回工作簿的 By​​teArrayOutputStream

到目前为止我尝试过的内容如下

      @PostMapping("/downloadFile")
      public ResponseEntity<Resource> getFile(@RequestPart("reqObj") String reqObj) {
          logger.info("*************** Inside downloadFile API *****************");
          JSONObject jsonObject = new JSONObject(reqObj);         
          return fileGeneration.generate(jsonObject.getInt("Id"));
      }

下面是商务舱

private ResponseEntity generateHelper(MyPojo obj) {
        if(obj.getId() == null)
            return new ResponseEntity("Invalid ID",null,HttpStatus.BAD_REQUEST);
        
        String filename = "my_file_name.xlsx";
        
         try (Workbook workbook = new XSSFWorkbook(); ByteArrayOutputStream out = new ByteArrayOutputStream();) {
             
              //Where I create required sheets in the workbook
              createSheets(workbook);
              List<Sheetone> sheetoneData = sheetoneRepository.findData(obj.getId());
              asyncService.populateSheetone(workbook,sheetoneData);
              List<SheetTwo> sheetTwoData = sheetTwoRepository.findData(obj.getId());
              asyncService.populateSheetTwo(workbook,sheetTwoData);
              
              //Logic to populate multiple other sheets
              //How can I combine the result of asynchonous methods and get the workbook instance after populating all the sheets
              
              
              workbook.write(out);
              return ResponseEntity.ok()
                    .header(HttpHeaders.CONTENT_disPOSITION,"attachment; filename=" + filename)
                    .contentType(MediaType.parseMediaType("application/octet-stream")).body(new InputStreamResource(new ByteArrayInputStream(out.toByteArray())));
            } catch (Exception e) {
                return new ResponseEntity(e.getLocalizedMessage(),HttpStatus.INTERNAL_SERVER_ERROR);
            }
    }

我有以下 AsyncConfig

@Configuration
@EnableAsync
public class AsyncConfiguration 
{
    @Bean(name = "asyncExecutor")
    public Executor asyncExecutor() 
    {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(10);
        executor.setMaxPoolSize(10);
        executor.setQueueCapacity(100);
        executor.setThreadNamePrefix("AsynchThread-");
        executor.initialize();
        return executor;
    }
}

以及低于 AsyncService

@Service
public class BaseLineDcmFileGenerationAsyncService {
    @Async("asyncExecutor")
    public CompletableFuture populateSheetone(Workbook workbook,Sheetone sheetoneData) {
        
          Sheet sheet = workbook.getSheet("Sheetone");

          Row headerRow = sheet.createRow(0);

          for (int col = 0; col < headers.length; coL++) {
            Cell cell = headerRow.createCell(col);
            cell.setCellStyle(setBoldFont(workbook));
            cell.setCellValue("value_from_an_static_array");
          }

          for(int i = 0; i < sheetoneData.size(); i++) {
            Row row = sheet.createRow(i+1);
            
            row.createCell(0).setCellValue(sheetoneData.getData());
            .....
          }
          
        return CompletableFuture.completedFuture(workbook);
    }
    
    @Async("asyncExecutor")
    public CompletableFuture populateSheetone(Workbook workbook,SheetTwo sheetTwoData) {
        
          Sheet sheet = workbook.getSheet("SheetTwo");

          Row headerRow = sheet.createRow(0);

          for (int col = 0; col < headers.length; coL++) {
            Cell cell = headerRow.createCell(col);
            cell.setCellStyle(setBoldFont(workbook));
            cell.setCellValue("value_from_an_static_array");
          }

          for(int i = 0; i < sheetTwoData.size(); i++) {
            Row row = sheet.createRow(i+1);
            
            row.createCell(0).setCellValue(sheetTwoData.getData());
            .....
          }
          
        return CompletableFuture.completedFuture(workbook);
    }
    
    private CellStyle setBoldFont(Workbook wb) {
        CellStyle style = wb.createCellStyle();
        Font font = wb.createFont();
        font.setBold(true);
        style.setFont(font);
        return style;
    }
}

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)