首頁  >  文章  >  Java  >  如何將百萬資料分成多個sheet頁?

如何將百萬資料分成多個sheet頁?

零下一度
零下一度原創
2017-07-17 15:26:582743瀏覽

如何將百萬資料分成多個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 100 13 月);   // turn off auto-flushing and accumulate all rows in memory

值100  在記憶體中保留100行,超過行將刷新到磁碟

###### ##########值-1表示無限制存取。 在這種情況下所有,沒有被呼叫flush()刷新的記錄可用,#########用於隨機存取。 ############### ######文章最後說,當暫存檔案過大時,可使用setCompressTempFiles方法進行壓縮,########## #####比較貪心,這裡我用了兩個,一個用來設定臨時文件,另一個用來輸入數據,測試數據為30w數據,結果如圖,不過還是感覺花費時間太多,不知道是不是我的程式寫的有問題,知道的小夥伴,留個言吧! ############

以上是如何將百萬資料分成多個sheet頁?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn