2013-03-15 48 views
1

我越來越SocketConnectionException而產生的大量數據(超過0.5萬條記錄)Excel文件Excel文件。插座異常而產生批量使用Apache POI

我的web應用程序的代碼寫入到`的OutputStream。下面是一個代碼片段:

while (sr.next()) { 
     counter++; //advance counter 
     view = (DataClass) sr.get(0); 
     try { 
      //writing fields values for Activity Report file 
      reportService.writeExcelFieldsValue(rowCounter,sheet,view,user,exportedFields); 
      rowCounter++; 
     } catch (Exception e) { 
      throw new RuntimeException(e); 
     } 

     if (counter == chunkSize || sr.isLast()) { 
      counter = 0; //reset counter 
      //Clear the session after a chunk and before next chunk 
      getSession().clear(); 
     } 
} 
wb.write(bos); 
bos.flush(); 

回答

0

POI提供建立在XSSF之上的低內存佔用SXSSF API。

SXSSF是XSSF的API兼容流擴展時非常大的電子表格必須生產中使用,和堆空間是有限的。 SXSSF通過限制對滑動窗口內行的訪問來實現低內存佔用量,而XSSF允許訪問文檔中的所有行。在窗口中不再存在的舊行不可訪問,因爲它們被寫入磁盤。

在自動刷新模式,可以指定的訪問窗口的大小,以保持在存儲器中的一定的行數。達到該值時,創建附加行會導致索引最低的行從訪問窗口中刪除並寫入磁盤。或者,可以將窗口大小設置爲動態增長;可以根據需要通過顯式調用flushRows(int keepRows)來定期修剪。

由於執行的流性質,也有相比XSSF以下限制:

  • 只有行的數量有限,在某個時間點訪問。
  • 不支持Sheet.clone()。不支持公式估計
  • 我覺得這個鏈接可以幫助你

我想你會想使用XSSF EventModel代碼。請參閱POI documentation開始。或瞭解更多詳情,請點擊here

而且這個鏈接可以幫助你。 Writing a large resultset to an Excel file using POI