Heim  >  Artikel  >  Java  >  Wie teilt man Millionen von Daten in mehrere Blätter auf?

Wie teilt man Millionen von Daten in mehrere Blätter auf?

零下一度
零下一度Original
2017-07-17 15:26:582785Durchsuche

So teilen Sie Millionen von Daten in mehrere Blätter auf und exportieren sie nach Excel

Der Export von Millionen von Daten nach Excel ist sehr einfach. Sie müssen nur das ursprüngliche HSSFWorkbook in SXSSFWorkbook ändern Ok, aber wenn es 3 Millionen Daten gibt, importieren Sie sie auf einmal in eine Excel-Tabellenseite. Denken Sie darüber nach, dass das Öffnen von Excel eine Weile dauern wird. Wenn es langsam ist, kann es dazu führen, dass das Programm nicht geladen wird. oder der Prozess wird direkt beendet, oder er wird geöffnet. Es gibt so viele Daten, dass es mir Kopfschmerzen bereitet. Ich habe einmal eine Neuigkeit gesehen und bewundere zutiefst die Beharrlichkeit der Ausländer.

Ein Teil des Codes wird hier als Referenz und Recherche bereitgestellt:

@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. So exportieren Sie Daten effizient

Paging wurde implementiert. Beim Exportieren großer Datenmengen müssen Effizienzaspekte berücksichtigt werden. Wie können wir Zeit sparen? Da Apache POI eine Methode zum Exportieren von Excel bereitstellt, muss die Effizienz berücksichtigt worden sein. Wenn Sie sich die Dokumentation ansehen, bedeutet dies wahrscheinlich, dass SXSSF verwendet wird, wenn große Tabellenkalkulationen generiert werden müssen limitiert Bietet offiziell zwei Typen Methode:

1. SXSSFWorkbook wb = new SXSSFWorkbook(100); // 100 Zeilen im Speicher behalten, überschüssige Zeilen werden auf die Festplatte geleert

2. SXSSFWorkbook wb = new SXSSFWorkbook(-1 ; >

Ein Wert von -1 gibt unbegrenzten Zugriff an. In diesem Fall sind alle Datensätze verfügbar, die nicht durch Flush() geleert wurden, wird für den wahlfreien Zugriff verwendet.

Am Ende des Artikels heißt es, dass Sie die temporäre Datei mit der Methode setCompressTempFiles komprimieren können, wenn sie zu groß ist,

Ich habe hier zwei verwendet, eine wird zum Einrichten temporärer Dateien und die andere zur Eingabe von Daten verwendet. Die Ergebnisse sind wie in Ich habe jedoch immer noch das Gefühl, dass es zu lange dauert. Es liegt nicht daran, dass mit dem Schreiben meines Programms etwas nicht stimmt.

Das obige ist der detaillierte Inhalt vonWie teilt man Millionen von Daten in mehrere Blätter auf?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn