> Java > java지도 시간 > 본문

수백만 개의 데이터를 여러 시트로 나누는 방법은 무엇입니까?

零下一度
풀어 주다: 2017-07-17 15:26:58
원래의
2743명이 탐색했습니다.

수백만 개의 데이터를 여러 시트 페이지로 나누어 Excel로 내보내는 방법

수백만 개의 데이터를 Excel로 내보내는 방법은 매우 간단합니다. 하지만 원본 HSSFWorkbook을 SXSSFWorkbook으로 수정하면 됩니다. , 엑셀 시트 페이지를 한번에 가져오세요. 엑셀을 여는 데 시간이 좀 걸릴 것입니다. 속도가 느리면 프로그램이 로드되지 않거나, 프로세스가 바로 종료되거나, 열릴 수도 있습니다. 자료가 너무 많아서 보기만 해도 머리가 아프네요. 뉴스를 하나 봤는데, 이곳에 계신 외국인들의 끈기에 깊은 존경심을 표합니다.

코드의 일부는 참조 및 연구용으로 제공됩니다. 페이징이 구현되었습니다.

@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가 사용된다는 의미일 것이며, 힙 공간은 다음과 같습니다. Limited 공식에서는 2가지 방법을 제공합니다:

1. SXSSFWorkbook wb = new SXSSFWorkbook(100); // 100개 행을 메모리에 유지하고 초과하는 행은 디스크에 플러시됩니다.

2.SXSSFWorkbook wb = new SXSSFWorkbook(-1); // 자동 플러시를 끄고 메모리에 모든 행을 누적합니다.

값 100 메모리에 100개의 행을 유지하고 초과 행은 디스크에 플러시됩니다.

값 -1은 무제한 액세스를 의미합니다. 이 경우 플러시()를 호출하여 플러시된 레코드는 모두 사용할 수 없습니다. 무작위 액세스가 가능합니다.

기사 마지막에 임시 파일이 너무 크면 setCompressTempFiles 메서드를 사용하여 압축할 수 있다고 나와 있습니다.

여기에서는 두 개를 사용하여 하나를 설정했습니다. 임시 파일과 다른 데이터를 입력하는 데 사용됩니다. 테스트 데이터는 30w 데이터입니다. 그러나 여전히 시간이 너무 많이 걸리는 것 같습니다. 내 프로그램 작성에 문제가 있으면 메시지를 남겨주세요!

위 내용은 수백만 개의 데이터를 여러 시트로 나누는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!