如何将百万数据分成多个sheet页?

如何将百万数据分成多个sheet页,导出到excel

导出百万数据到excel,很简单,只需要将原来的HSSFWorkbook修改成SXSSFWorkbook,就可以了,但是如果有300w条数据,一下导入一个excel的sheet页中,想想打开excel也需要一段时间吧,慢的话有可能导致程序无法加载,或者直接结束进程的情况发生,或者打开了,那么多数据,看着就头疼,曾看到过一段新闻 ,这里对老外的毅力也是深表佩服。

这里给出部分代码,供参考研究,分页已实现:

@SuppressWarnings({ "deprecation", "unchecked" })    @RequestMapping("export-TrainHistoryRecord")    @ResponseBodyprotected void buildExcelDocument(EmployeeTrainHistoryQuery query,ModelMap model,            SXSSFWorkbook workbook, HttpServletRequest request,            HttpServletResponse response) throws Exception {try {            response.reset();// 获得国际化语言RequestContext requestContext = new RequestContext(request);            String CourseCompany = requestContext                    .getMessage("manage-student-trainRecods");            response.setContentType("APPLICATION/vnd.ms-excel;charset=UTF-8");// 注意,如果去掉下面一行代码中的attachment; 那么也会使IE自动打开文件。            response.setHeader("Content-Disposition","attachment; filename="                            + java.net.URLEncoder.encode(                                    DateUtil.getExportDate() + ".xlsx", "UTF-8"));//Excel 扩展名指定为xlsx  SXSSFWorkbook对象只支持xlsx格式OutputStream os = response.getOutputStream();            CellStyle style = workbook.createCellStyle();// 设置样式style.setFillForegroundColor(HSSFColor.SKY_BLUE.index);//设置单元格着色style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);  //设置单元格填充样式style.setBorderBottom(HSSFCellStyle.BORDER_THIN);//设置下边框style.setBorderLeft(HSSFCellStyle.BORDER_THIN);//设置左边框style.setBorderRight(HSSFCellStyle.BORDER_THIN);//设置右边框style.setBorderTop(HSSFCellStyle.BORDER_THIN);//上边框style.setAlignment(HSSFCellStyle.ALIGN_CENTER);// 居中//获取国际化文件String employeeCode = requestContext.getMessage("employeeCode");            String employeeName = requestContext.getMessage("employeeName");            String orgName = requestContext.getMessage("orgName");            String startDate = requestContext.getMessage("start.date");            String endDate = requestContext.getMessage("end.date");            String courseCode = requestContext.getMessage("courseCode");            String courseName = requestContext.getMessage("courseName");            String sessionName = requestContext.getMessage("sessionName");            List<EmployeeTrainHistoryModel> list = null;try {//查询数据库中共有多少条数据                            query.setTotalItem(employeeTrainHistoryService.fetchCountEmployeeTrainHistoryByQuery(query));                int page_size = 100000;// 定义每页数据数量int list_count =query.getTotalItem();//总数量除以每页显示条数等于页数int export_times = list_count % page_size > 0 ? list_count / page_size+ 1 : list_count / page_size;                     //循环获取产生每页数据for (int m = 0; m < export_times; m++) {                        query.setNeedQueryAll(false);                        query.setPageSize(100000);//每页显示多少条数据query.setCurrentPage(m+1);//设置第几页 list=employeeTrainHistoryService.getEmployeeTrainHistoryByQuery(query);//新建sheet Sheet sheet = null;                            sheet = workbook.createSheet(System.currentTimeMillis()+ CourseCompany+m);// 创建属于上面Sheet的Row,参数0可以是0~65535之间的任何一个,Row header = sheet.createRow(0); // 第0行// 产生标题列,每个sheet页产生一个标题                             Cell cell;                            String[] headerArr = new String[] { employeeCode, employeeName,                                    orgName, startDate, endDate, courseCode, courseName, sessionName,                                    hoursNunber };for (int j = 0; j < headerArr.length; j++) {                                cell = header.createCell((short) j);                                cell.setCellStyle(style);                                cell.setCellValue(headerArr[j]);                            }// 迭代数据 if (list != null && list.size() > 0) {                                 int rowNum = 1;                                 for (int i = 0; i < list.size(); i++) {                                     EmployeeTrainHistoryModel history=list.get(i);                                         sheet.setDefaultColumnWidth((short) 17);                                     Row row = sheet.createRow(rowNum++);                                     row.createCell((short) 0).setCellValue(                                             history.getEmployeeCode());                                     row.createCell((short) 1).setCellValue(                                             history.getEmployeeName());                                     row.createCell((short) 2)                                             .setCellValue(history.getOrgName());                                     if (history.getTrainBeginTime() != null) {                                         row.createCell((short) 3).setCellValue(                                                 DateUtil.toString(history.getTrainBeginTime()));                                     } else {                                         row.createCell((short) 3).setCellValue("");                                     }                                     if (history.getTrainEndTime() != null) {                                         row.createCell((short) 4).setCellValue(                                                 DateUtil.toString(history.getTrainEndTime()));                                     } else {                                         row.createCell((short) 4).setCellValue("");                                     }                                     row.createCell((short) 5).setCellValue(                                             history.getCourseCode());                                     row.createCell((short) 6).setCellValue(                                             history.getCourseName());                                     row.createCell((short) 7).setCellValue(                                             history.getSessionName());                                     if (history.getHoursNumber() != null)                                         row.createCell((short) 8).setCellValue(                                                 history.getHoursNumber().toString());                                 }                             }                                                          list.clear();                         }                                        } catch (Exception e) {                e.printStackTrace();            }try {                workbook.write(os);                os.close();            } catch (Exception e) {// TODO Auto-generated catch block                e.printStackTrace();            }        } catch (IOException e) {            e.printStackTrace();        }    }

4.如何高效导出数据

分页已实现,大数据量导出数据,势必要考虑效率问题,怎么才能去压榨时间?Apache POI既然提供了导出excel的方法,想必也考虑到了效率问题,查看官方文档 果不其然,看文档,大概意思就是说SXSSF在必须生成大型电子表格时使用,堆空间有限 官方提供了2种方法:

1. SXSSFWorkbook wb = new SXSSFWorkbook(100); // keep 100 rows in memory, exceeding rows will be flushed to disk

2.SXSSFWorkbook wb = new SXSSFWorkbook(-1); // turn off auto-flushing and accumulate all rows in memory

值100 在内存中保留100行,超过行将被刷新到磁盘

值-1表示无限制访问。 在这种情况下所有,没有被调用flush()刷新的记录可用,用于随机访问。

文章在最后说,当临时文件过大时,可使用setCompressTempFiles方法进行压缩,

比较贪心,这里我用了两个,一个用来设置临时文件,另一个用来输入数据,测试数据为30w数据,结果如图,不过还是感觉花费时间太多,不知道是不是我的程序写的有问题,知道的小伙伴,留个言吧!

以上就是如何将百万数据分成多个sheet页?的详细内容,更多请关注其它相关文章!

做对的事情比把事情做对重要。

如何将百万数据分成多个sheet页?

相关文章:

你感兴趣的文章:

标签云: