问题描述
我必须将数据填充到多张excel表中,由于每张表中要写入的数据很大,处理时间很慢,我需要异步写入表中
我有一个控制器,它将返回工作簿的 ByteArrayOutputStream
到目前为止我尝试过的内容如下
@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);
}
}
@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 (将#修改为@)