簡體   English   中英

工作簿需要很長時間才能生成Excel文件

[英]Workbook takes long time to generate excel file

我正在嘗試生成具有20萬條記錄的excel文件。 但是生成文件大約需要2個小時。

這是我生成excel文件的代碼。

Workbook workbook=null;

csvFileName = userId+"_Records_"+new SimpleDateFormat("yyyyMMddHHmmss")
         .format(new Date())+".xls";
path = ReadPropertyFile.getProperties("download.reports.path");



 misService.insertXLSRecord(ackNo,"-",null, VspCommonConstants.getIpFromRequest(request),
    new Date(), userId,"N",userReportRoleId);

  workbook = getWorkbook(path+csvFileName);


 Sheet sheet = workbook.createSheet(WorkbookUtil.createSafeSheetName(studAppForm.get(0)
    .getScheme_Id()+"_"+studAppForm.get(0).getEFP_Scholarship_Name(),'_'));

 if(schemeQuestionData.containsKey(currSheetSchemeId))
                   createXLSHeaders(sheet,schemeQuestionData.get(currSheetSchemeId));

 Row row = sheet.createRow(++rowCount);


currAppId=studAppForm.get(j).getApp_Id().toString();
jspTableAppIds.remove(jspTableAppIds.indexOf(new BigInteger(currAppId)));
writeBook(studAppForm.get(j), row);

這是我的createXLSHeaders方法來創建標題

void createXLSHeaders( Sheet sheet, List<SchemeMasterBean> schemeMasterBeanList){

       LOGGER.info("Creating XLS SheetHeaders for sheet "+sheet.getSheetName());

     //   Sheet sheet = workbook.createSheet();
        Row header = sheet.createRow(0);
        header.createCell(0).setCellValue("APPLICATION ID");
        header.createCell(1).setCellValue("APPLICATION STATUS");
        header.createCell(2).setCellValue("APPLICATION DATE");
        header.createCell(3).setCellValue("SCHEME/SCHOLARSHIP APPLIED");
        header.createCell(4).setCellValue("SCHEME ID");
        header.createCell(5).setCellValue("STUDENT ID");
        header.createCell(6).setCellValue("STUDENT FULL NAME");
        .
        .
        .
        62 heading...

        int i=73;
        if(schemeMasterBeanList!=null)
        for(SchemeMasterBean schemeMasterBean :schemeMasterBeanList){
               if(!schemeMasterBean.getSmSchemeType().equals("5") && 
                   !schemeMasterBean.getSmSchemeType().equals("6")){
               header.createCell(i).setCellValue(schemeMasterBean.getSmScholarshipName());
               i++;
               }
        }
    }

最后寫書方法

private void writeBook(StudentAppFormVsp saf, Row row) throws JSONException {


    Cell cell = row.createCell(0);
    cell.setCellValue(saf.getApp_Id()!=null?saf.getApp_Id().toString():"");
    cell = row.createCell(1);
    cell.setCellValue(saf.getApp_Status()!=null?getApplicationStatusMap().get(saf.getApp_Status()):"");
    cell = row.createCell(2);
    cell.setCellValue(saf.getCrtn_time()!=null?saf.getCrtn_time().toString():"");
    cell = row.createCell(3);
    cell.setCellValue(saf.getEFP_Scholarship_Name()!=null?saf.getEFP_Scholarship_Name().toString():"");
    cell = row.createCell(4);
    cell.setCellValue(saf.getScheme_Id()!=null?saf.getScheme_Id().toString():"");
    cell = row.createCell(5);
    cell.setCellValue(saf.getStud_Id()!=null?saf.getStud_Id().toString():"");

                  .
                  .
                  62 rows

}

如何減少Excel工作表的生成時間?

第一:盡可能為應用程序使用內存。

然后:使用分析器的技巧確實值得付出。

任何DOM,XML,Excel或其他方式通常都會遭受從頂部到實際位置搜索的位置引用。

就內存而言,創建DOM而不是順序寫入會產生很高的成本,並且會使速度變慢。 也許考慮一下

您可以進行兩個循環:寫入CSV文件,然后創建XLS(X)。 然后,您知道復雜性所在的位置。

以下內容(我重寫了一點)有點懷疑: toString + new BigInteger指向一個轉換; 我希望不要從BigInteger到String再到BigInteger。

StudentAppFormVsp saf = studAppForm.get(j);
currAppId = saf.getApp_Id().toString();
jspTableAppIds.remove(jspTableAppIds.indexOf(BigInteger.valueOf(currAppId)));
writeBook(saf, row);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM