2016-04-10 40 views
-4

我使用Apache POI Streaming API-SXSSFWorkbook將數據寫入excel文件。 但是,如果文件大小大於100Mb,Excel文件通常會損壞超過100 000條包含300列的記錄。有沒有辦法將大量數據寫入excel文件。將300萬條記錄寫入300列的Excel文件

class Test1 { 
    public static void main(String[] args) throws FileNotFoundException, { 


    SXSSFWorkbook workbook = new SXSSFWorkbook(100); 

    workbook.setCompressTempFiles(true); 
    Sheet sheet = null; 
    Row row = null; 
    Cell cell = null; 
    sheet = workbook.createSheet("Demo1"); 
    FileOutputStream outStream = new FileOutputStream("D:\\Test1.xlsx"); 
    try { 

     for (int i = 0; i < 100000; i++) { 
      row = sheet.createRow(i); 
      for (int j = 0; j < 300; j++) { 
       cell = row.createCell(j); 
       cell.setCellValue(" row : "+i +" col: "+ j); 
      } 
     } 


     workbook.write(outStream); 

    } catch (Exception exception) { 
     exception.printStackTrace(); 
    } finally { 
     workbook.dispose(); 
     try { 
      outStream.close(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

    } 
} 

編輯1:

我發現,它是不是與Apache POI流Api.It問題產生100萬個的記錄文件。但Excel不加載該文件。它給出'沒有足夠的內存來完成這個動作'的錯誤。

我使用Excel 2013 32位版本,它只能使用2GB的內存。我用100k條記錄和300列創建的excel文件的文件大小爲108MB。當我嘗試在Excel中打開這個文件時,它佔用了大量的系統內存。一旦內存消耗達到1.7 MB,Excel就會報錯。

加載使用Apache Streaming API生成的100萬行的最低配置是多少?任何幫助,將不勝感激。

謝謝。

編輯2: 如果我打開以zip格式使用Apache流API生成的Excel文件(通過重命名.XLSX爲.zip),在XL->工作表文件夾中的XML文件的大小是大約爲2GB 100k的記錄和300列。有什麼辦法可以減小這個xml文件的大小。

+1

問題是什麼?我正在使用SXSSF流編寫大型XLSX文件,並沒有遇到問題。 (除了有足夠的磁盤空間與輸出和tmp區域)。 – rpy

+0

當我嘗試使用Excel 2007打開文件時,它顯示'Excel發現不可讀的內容'。任何幫助將非常感激。 – teja

+0

您是否確認有足夠的磁盤空間?生成一個工作的Excel文件的相同代碼只生成一些行(例如<100k)?它是否使用較少的列(例如<256)? – rpy

回答

1

從來沒有嘗試過自己生成超過100到120列。但是,最大255列的限制並不令人驚訝(以前的Excel格式就是這種方式)。你觀察到100列200列的工作正常,而100列100列的列失敗,這是這種限制的有力指標。

然後,您應該可以生成100萬(正好爲1048576)的行,最多可以包含255列。對於任何額外的行和額外的列,您將需要創建額外的工作表。

因此,對於您的300列目標,您將生成帶有前255列的sheet1(如果有合理的邏輯分組,則會減少一些),並將sheet2與其他列一起生成。

對於更多行,使用一副新的紙張重複2張紙的方法,直到生成所有行。

順便說一句,
你是否認識到,使用SXSSFWorkbook一行「AccessAccessWindowSize」是給予最佳性能?

+0

感謝您的回覆。您使用哪種辦公室版本打開100萬行100列的文件。我正在使用Excel 2007 32位版本。如果我嘗試打開該文件,它提供的資源不足以顯示錯誤消息。 – teja

+0

個人使用LibreOffice。但是錯誤消息聽起來像您的機器太小,無法打開文件。 – rpy

+0

您可以共享系統配置詳細信息,該詳細信息用於加載使用Apache Streaming API生成的100萬條記錄。 謝謝。 – teja