多线程并发写入Excel的多个sheet的报错问题
1、请在主线程事先实例化sheet
例如:
String fileName = certType + "列表信息.xlsx";
response.setContentType("application/octet-stream");
response.setHeader("Content-disposition", "attachment; filename=" + new String(fileName.getBytes("utf-8"), "ISO8859-1"));
// 去读模板表格
XSSFWorkbook xwb = new XSSFWorkbook();
// 先主线程创建四个sheet(如果是异步去写多个sheet,那么必须事先定义好sheet,这样可以保证sheet的顺序不会乱,否则异步创建sheet的时候需要加锁,不然会报错。)
XSSFSheet sheetAt0 = xwb.createSheet(certType);
XSSFSheet sheetAt1 = xwb.createSheet(certType+"-ITR");
XSSFSheet sheetAt2 = xwb.createSheet(certType + "-ITP");
XSSFSheet sheetAt3 = xwb.createSheet(certType + "-PL");;
2、然后再开启异步去写入数据:
CompletableFuture<Void> future0 = CompletableFuture.runAsync(() -> {
long time1 = System.currentTimeMillis();
fillAccListExcelData(sheetAt0,xwb, accList, certStatusMap, certType);
log.info("===============导出sheet1的时间:{}", (System.currentTimeMillis() - time1) / 1000);
});
CompletableFuture<Void> future1 = CompletableFuture.runAsync(() -> {
long time2 = System.currentTimeMillis();
fillAccOfItrListExcelData(sheetAt1,xwb, accOfItrList, certType);
log.info("===============导出sheet2的时间:{}", (System.currentTimeMillis() - time2) / 1000);
});
CompletableFuture<Void> future2 = CompletableFuture.runAsync(() -> {
long time3 = System.currentTimeMillis();
fillAccOfItpListExcelData(sheetAt2,xwb, accOfItpList, certType);
log.info("===============导出sheet3的时间:{}", (System.currentTimeMillis() - time3) / 1000);
});
CompletableFuture<Void> future3 = CompletableFuture.runAsync(() -> {
long time4 = System.currentTimeMillis();
fillAccOfPlListExcelData(sheetAt3,xwb, accOfPlList, certStatusMap, certType);
log.info("===============导出sheet4的时间:{}", (System.currentTimeMillis() - time4) / 1000);
});
CompletableFuture<Void> allFuture = CompletableFuture.allOf(future0, future1, future2,future3);
allFuture.join();
// 输出文件
xwb.write(out);