2014-01-09 6 views
3

Я пытаюсь создать файл .xls, содержащий почти 13000 строк и 3 столбца, используя библиотеку POI. Но для создания этого полного файла требуется почти 8-10 минут. Может ли кто-нибудь предложить, как уменьшить время выполнения?Оптимизация генерации Excel Excel

public static void generateReconReport(Connection con,String neName,String reportTable) throws SQLException, IOException{ 
    Statement stmt = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); 

    String sql = "SELECT * FROM "+reportTable; 
    ResultSet rsNERecon = stmt.executeQuery(sql); 

    System.out.println("Resulset obtained, Generating Report"); 

    Date date = new Date(); 
    SimpleDateFormat sid = new SimpleDateFormat("MMddyyyy"); 
    String curDate = sid.format(date); 

    String fileName = neName.toUpperCase()+"_" + curDate + ".xlsx"; 

    File ob_file = new File(fileName); 
    if(!ob_file.exists()) 
     ob_file.createNewFile(); 

    HSSFWorkbook hsfWb = new HSSFWorkbook(); 

    HSSFSheet hsfSheet = hsfWb.createSheet(neName.toUpperCase()+" Recon Report"); 

    HSSFRow hsfRow = hsfSheet.createRow(0); 

    ResultSetMetaData metaRs = rsNERecon.getMetaData(); 
    int colCount = metaRs.getColumnCount(); 

    for (int j = 1; j <= colCount; j++) { 
     String colName = metaRs.getColumnName(j); 
     hsfRow.createCell(j).setCellValue(colName); 
    } 
    FileOutputStream fileOut = new FileOutputStream(fileName); 
    int rowNum = 1; 
    while (rsNERecon.next()) { 
     hsfRow = hsfSheet.createRow(rowNum); 
     for (int j = 1; j <= colCount; j++) 
      hsfRow.createCell(j).setCellValue(rsNERecon.getString(j)); 
     rowNum++; 
    } 

    for (int j = 1; j <= colCount; j++) 
     hsfSheet.autoSizeColumn(j); 

    rsNERecon.close(); 
    stmt.close(); 

    hsfWb.write(fileOut); 
    fileOut.close(); 
    System.out.println("Report generated for "+neName.toUpperCase()); 
} 
+0

Вы пробовали профилировать код? Ваши показатели производительности звучат необычно плохо, так что возможно, что задержка на самом деле не в POI, а в другом месте (например, в части базы данных)? – Gagravarr

ответ

2

Создание файла символов значения, разделенные (CSV), используя либо вкладку или запятой в качестве разделителя будет намного быстрее. Сохраните файл с расширением .csv.

Excel очень быстро читает эти файлы.

1

По моему опыту, я нашел POI очень полезную для чтения файлов Excel, но довольно много времени и памяти, когда они приходят, чтобы сгенерировать их. Я могу предложить вам 3 варианта:

1) По классам, которые вы используете (HSSF *), я думаю, вы можете использовать более старую версию POI. Я предлагаю вам перейти на последнюю версию и посмотреть, не улучшилось ли это. С небольшими изменениями кода вы даже можете получить версию кода, которая генерирует форматы .xls и .xlsx, поэтому вы можете профилировать оба параметра (при условии, что вы можете создать любой другой формат, чем .xls). - EDITED: я недавно возможность для тестирования производительности SXSSF и имеет большой производительность, как с точки зрения памяти и скорости

2) Как кто-то предложил, генерируя .csv будет намного быстрее, но вы потеряете форматирование (и что если вы можете создать формат, отличный от .xls)

3) Если вы можете использовать формат, отличный от .xls, я предлагаю вам посмотреть формат Excel XML Spreadsheet. Мы используем его в течение многих лет, и падение состоит в том, что нам пришлось работать над собственной реализацией формата. Однако, если вы готовы инвестировать день или два, реализуя его, ваша реализация должна быть намного более эффективной, чем POI во времени и использовании памяти.

http://msdn.microsoft.com/en-us/library/office/aa140066%28v=office.10%29.aspx

+0

Я знаю, что был немного расплывчатым по поводу варианта 3), но его добровольный - код не мой, чтобы распоряжаться. Было бы неплохо, если бы у меня было время переписать его с нуля и поместить в github, но это нереально прямо сейчас в моем графике. Тем не менее, для всех, кто интересуется этим, реализация действительно проста и может занять несколько часов в зависимости от ваших целей. В моей первой реализации я потратил пару дней на реализацию более или менее 20-30% функциональных возможностей спецификации, чего было достаточно для меня. Еще пару дней, чтобы реализовать красивые форматы ... это зависит от пользователя :) –

+0

Я, наконец, нашел это время, поэтому здесь это реализация с нуля значительной части этой спецификации ... так же хорошо, как и Стоит: P 10 из 10 раз Я бы использовал SXSSF, но было интересно написать его :) https://github.com/jorgeb1980/XMLSpreadsheetGenerator –

Смежные вопросы