2012-01-22 10 views
5

Oto kod, który generuje plik .xls za pomocą JXL:Porównanie wydajności pomiędzy JXL i POI dla programu Excel pokolenia plików

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(); 
    } 

} 

Oto kod, który generuje pliki .xls i .xlsx pomocą POI:

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(); 
    } 


} 

pisałem test wydajności:

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); 
} 

wyniki są następujące: arkusz s = 1 cols = 255 rzędy = 10 xlsJXL: 133 xlsPOI: 162 xlsxPOI: 645

arkuszy = 1 cols = 10 rzędy = 255 xlsJXL: 130 xlsPOI: 140 xlsxPOI 650

arkuszy = 10 cols = 255 rzędy = 255 xlsJXL: 611 xlsPOI: 784 xlsxPOI: 16228

arkuszy = 2 cols = 100 rzędy = 10000

xlsJXL: 2755 xlsPOI: 3270 xlsxPOI Wyjątek: W odpowiedzi na "głównym" java.lang.OutOfMemoryError: przestrzeń sterty Java

dowolnego powodu tworzenia .xlsx z POI jest znacznie wolniejsze niż tworzenie .xls?

Odpowiedz

5

xls jest formatem binarnym, xlsx jest formatem opartym na XML i wymaga więcej pracy do odczytu/zapisu.

xlsx może również wymagać modelu dokumentu w pamięci do przeanalizowania/zbudowania kodu XML, który może być bardziej złożony.

Wreszcie, XLS może być lepiej zoptymalizowany, ponieważ był obsługiwany dłużej.

+1

, więc nie ma rozwiązania do budowania plików xlsx szybciej niż moje wdrożenie? – AAaa

+1

Nie to, co wiem. Mogą istnieć inne biblioteki, które robią to szybciej. –

Powiązane problemy