2012-01-22 11 views
5

はJXLを使用して.xlsファイルを生成するコードです:ここでは性能比較ファイルの世代をエクセル

public void generateXls(String fileName, int sheets, int cols, int rows) { 

    if (cols > 256) { 
     throw new IllegalArgumentException("Error: number of cols per sheet must be < 256"); 
    } 

    if (rows > 65536) { 
     throw new IllegalArgumentException("Error: number of rows per sheet must be < 65536"); 
    } 

    String fullName = fileName + ".xls"; 
    WritableWorkbook workbook = null; 
    try { 
     workbook = Workbook.createWorkbook(new File(fullName)); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    Random random = new Random(); 
    for (int s = 0; s < sheets; s++) { 
     WritableSheet sheet = workbook.createSheet("Sheet" + s, 0); 
     for (int i = 0; i < cols ; i++) { 
      for (int j = 0; j < rows; j++) { 
       Number number = new Number(i, j, random.nextDouble()*1000); 
       try { 
        sheet.addCell(number); 
       } catch (RowsExceededException e) { 
        throw new RuntimeException("Error: too many rows in a sheet"); 
       } catch (WriteException e) { 
        throw new RuntimeException("Error occured while adding cell to sheet", e); 
       } 
      } 
     } 
    } 

    try { 
     workbook.write(); 
     workbook.close(); 
    } catch (WriteException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

} 

は、POIを使用して.XLSとの.xlsxファイルを生成するコードは次のとおりです。

public void generateXlsx(String fileName, int sheets, int cols, int rows) { 

    if (cols > 16383) { 
     throw new IllegalArgumentException("Error: number of cols per sheet must be < 16383"); 
    } 
    XSSFWorkbook workbook = new XSSFWorkbook(); 

    Random random = new Random(); 
    for (int s = 0; s < sheets; s++) { 
     XSSFSheet sheet = workbook.createSheet(); 
     for (int i = 0; i < rows ; i++) { 
      XSSFRow row = sheet.createRow(i); 
      for (int j = 0; j < cols; j++) { 
       XSSFCell cell = row.createCell(j); 
       cell.setCellValue(random.nextDouble()*1000); 
      } 
     } 
    } 

    FileOutputStream fileOut = null; 
    try { 
     fileOut = new FileOutputStream(fileName); 
    } catch (FileNotFoundException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    try { 
     workbook.write(fileOut); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

    try { 
     fileOut.flush(); 
     fileOut.close(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 


} 

public void generateXls(String fileName, int sheets, int cols, int rows) { 

    if (cols > 256) { 
     throw new IllegalArgumentException("Error: number of cols per sheet must be < 256"); 
    } 

    HSSFWorkbook workbook = new HSSFWorkbook(); 

    Random random = new Random(); 
    for (int s = 0; s < sheets; s++) { 
     HSSFSheet sheet = workbook.createSheet(); 
     for (int i = 0; i < rows ; i++) { 
      HSSFRow row = sheet.createRow(i); 
      for (int j = 0; j < cols; j++) { 
       HSSFCell cell = row.createCell(j); 
       cell.setCellValue(random.nextDouble()*1000); 
      } 
     } 
    } 

    FileOutputStream fileOut = null; 
    try { 
     fileOut = new FileOutputStream(fileName); 
    } catch (FileNotFoundException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    try { 
     workbook.write(fileOut); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

    try { 
     fileOut.flush(); 
     fileOut.close(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 


} 

私は、パフォーマンステストを書いた:

public static void main(String[] args) { 

    int sheets =1; 
    int cols = 255; 
    int rows = 20000; 
    long a1 = System.currentTimeMillis(); 
    ExcelFileGenerator generator = new ExcelFileGenerator(); 
    generator.generateXls("xlsJXL.xls", sheets, cols, rows); 
    long xls = System.currentTimeMillis()-a1; 
    System.out.println("xlsJXL: " + xls); 
    ExcelFileGeneratorPOI generatorPOI = new ExcelFileGeneratorPOI(); 
    long a2 = System.currentTimeMillis(); 
    generatorPOI.generateXls("xlsPOI.xls", sheets, cols, rows); 
    long xlsPoi = System.currentTimeMillis()-a2; 
    System.out.println("xlsPOI: " + xlsPoi); 
    long a3 = System.currentTimeMillis(); 
    generatorPOI.generateXlsx("xlsxPOI.xlsx", sheets, cols, rows); 
    long xlsx = System.currentTimeMillis()-a3; 
    System.out.println("xlsxPOI: " + xlsx); 
} 

結果は次のとおりです。 シートS = 1つの COLS = 255 行= 10 xlsJXL:133 xlsPOI:162 xlsxPOI:645

シート= 1つの COLS = 10 行= 255 xlsJXL:130 xlsPOI:140 xlsxPOI:650

シート= 10の COLS = 255 行= 255 xlsJXL:611 xlsPOI:784 xlsxPOI:16228

シート= 2つの COLS = 100 行= 10000

xlsJXL:2755 xlsPOI:3270 xlsxPOI:スレッドの例外 "メイン" java.lang.OutOfMemoryErrorを:Javaヒープスペース

作成することによって、何らかの理由POIの.xlsxは.xlsの作成よりもはるかに遅いですか?

答えて

5

xlsは、バイナリベースのフォーマットです。xlsxは、XMLベースのフォーマットであり、読み書きするためにより多くの作業が必要です。

xlsxさらに複雑なXMLを解析/構築するには、メモリ内のドキュメントモデルが必要な場合もあります。

最後に、xlsはより長くサポートされているため、最適化される可能性があります。

+1

私の実装よりも速くxlsxファイルをビルドするソリューションはありませんか? – AAaa

+1

私が知っているわけではありません。より速くそれを行う他のライブラリがあるかもしれません。 –