6
/**
-
查询优化的方法 */ public void exportExcelByMultithreading(HttpServletResponse response, ThreadPoolTaskExecutor threadPoolTaskExecutor, Class
pojoClass, Integer pageSize, QueryWrapper queryWrapper) throws IOException { ServletOutputStream out = getServletOutputStream(response); // // 导出文件路径 // String fileName = "d:\test.xlsx"; Long count = baseMapper.selectCount(queryWrapper); Long sheetNum = count % pageSize == 0 ? count / pageSize:count / pageSize + 1; // 多线程去读 // 1.初始化map容量 防止扩容带来的效率损耗 Map<Integer, Page<T>> pageMap = new ConcurrentHashMap<>(Math.toIntExact(3)); CountDownLatch countDownLatch = new CountDownLatch(Math.toIntExact(3)); // 注意 easyexcel 暂时不支持多线程并发写入!!! 详情请看github上issues for (int i = 200 ;i< sheetNum;i++){ int finali = i; threadPoolTaskExecutor.submit(()->{ Page<T> page = new Page<>(); page.setCurrent(finali + 1); page.setSize(pageSize); // 获取数据存放到map中 Page<T> selectPage = baseMapper.selectPage(page,queryWrapper); pageMap.put(finali,selectPage); // 消耗掉一个 countDownLatch.countDown(); }); } try { countDownLatch.await(); } catch (InterruptedException e) { e.printStackTrace(); } // 写入 try (ExcelWriter excelWriter = EasyExcel.write(out, pojoClass).build()) { pageMap.forEach((k,v)->{ log.info("正在写入{}条数据",pageSize); WriteSheet writeSheet = EasyExcel.writerSheet(k, "第"+(k+1)+"批数据").build(); excelWriter.write(v.getRecords(), writeSheet); pageMap.remove(k); }); excelWriter.finish(); }
}