前几天朋友问了一下数据导出excel的问题,就推荐他用了HSSFWorkbook,但是当其操作的时候,6W条数据就花费了39s,耗时太长…后面自己查询了一些资料,整合了下:
解决方案:
1、异步生成Excel,非实时,完成后使用某种方式通知用户
2、生成多个excel文件,并打包成zip文件,因为一个excel容纳不了这么多数据,即使分别放在不同的sheet中也不行,文件太大,打开需要很长时间,用户体验不好
3、如果对数据格式没什么要求,可考虑导出csv文件,字符流,比excel快不少
4、后台可开多个线程,分别生成excel文件,然后再合并
5、可使用poi,但是poi是先将数据放在内存,然后再导出,所以建议一次不要在内存放过多数据,导致内存不足
6、poi有个专门处理大数据库的类(SXSSFWorkbook)
7、可尝试说服客户每天定时生成excel文件,而非通过用户操作生成
8、异步通知方法有短信、邮件、每次刷新页面获取最新状态、长连接方式实时通知
在分享SXSSFWorkbook的demo之前先科普一下基础知识:
Excel 2003及以下的版本。一张表最大支持65536行数据,256列。也就是说excel2003完全不可能满足百万数据导出的需求。
Excel 2007-2010版本。一张表最大支持1048576行,16384列;
demo:
1 public static void Excel2007AboveOperate(String filePath) throws IOException {
2 XSSFWorkbook workbook1 = new XSSFWorkbook(new FileInputStream(new File(filePath)));
3 SXSSFWorkbook sxssfWorkbook = new SXSSFWorkbook(workbook1, 100);
4 // Workbook workbook = WorkbookFactory.create(new FileInputStream(new File(filePath)));
5 Sheet first = sxssfWorkbook.getSheetAt(0);
6 for (int i = 0; i < 100000; i++) {
7 Row row = first.createRow(i);
8 for (int j = 0; j < 11; j++) {
9 if(i == 0) {
10 // 首行
11 row.createCell(j).setCellValue("column" + j);
12 } else {
13 // 数据
14 if (j == 0) {
15 CellUtil.createCell(row, j, String.valueOf(i));
16 } else
17 CellUtil.createCell(row, j, String.valueOf(Math.random()));
18 }
19 }
20 }
21 FileOutputStream out = new FileOutputStream("workbook.xlsx");
22 sxssfWorkbook.write(out);
23 out.close();
24 }
实测:插入10W条数据需要大概11秒 100W条数据大概需要90s样子…
本人目前小白一名,若有错误请及时联系~