Создание файла Excel занимает много времени - PullRequest
0 голосов
/ 30 ноября 2018

Я пытаюсь создать файл Excel с 200k записей.Но создание файла занимает почти 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?

1 Ответ

0 голосов
/ 30 ноября 2018

Сначала: по возможности поиграйте с памятью для приложения.

Затем: совет по использованию профилировщика действительно стоит усилий.

Любой DOM,XML, Excel или другие часто страдают от поиска ссылок на места сверху вниз к фактической позиции.

Создание DOM вместо последовательной записи является дорогостоящим по отношению к памяти и может замедлить работу.Возможно, рассмотрим this .

. Вы можете сделать два цикла: запись в файл 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);
...