2012-01-22 24 views
5

Đây là mã mà tạo ra tập tin .xls sử dụng JXL:Performance so sánh giữa JXL và POI CHO trội các thế hệ tập tin

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

} 

Đây là mã mà tạo ra .xls và các tập tin .xlsx sử dụng 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(); 
    } 


} 

tôi đã viết một bài kiểm tra hiệu suất:

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

Kết quả là: tờ s = 1 cols = 255 rows = 10 xlsJXL: 133 xlsPOI: 162 xlsxPOI: 645

tờ = 1 cols = 10 rows = 255 xlsJXL: 130 xlsPOI: 140 xlsxPOI: 650

tờ = 10 cols = 255 rows = 255 xlsJXL: 611 xlsPOI: 784 xlsxPOI: 16228

tờ = 2 cols = 100 rows = 10000

xlsJXL: 2755 xlsPOI: 3270 xlsxPOI: Exception in thread "main" java.lang.OutOfMemoryError: Java không gian đống

bất kỳ lý do bằng cách tạo .xlsx với POI chậm hơn nhiều so với việc tạo .xls?

Trả lời

5

xls là định dạng nhị phân, xlsx là định dạng dựa trên XML và yêu cầu nhiều công việc hơn để đọc/ghi.

xlsx cũng có thể yêu cầu mô hình tài liệu bộ nhớ phân tích/xây dựng XML có thể phức tạp hơn.

Cuối cùng, xls có thể được tối ưu hóa tốt hơn vì xls có thể được hỗ trợ lâu hơn.

+1

vì vậy không có giải pháp nào để tạo tệp xlsx nhanh hơn triển khai của tôi? – AAaa

+1

Không phải là tôi biết. Có thể có các thư viện khác làm nhanh hơn. –

Các vấn đề liên quan