2012-08-16 49 views
2

我試圖從Web應用程序寫出結果集(100,000行,45列)以使用JExcel 2.6.9 。JExcel(jxl):將大記錄集寫入excel工作表失敗(OutOfMemoryError:Java堆空間)

Caused by: 
java.lang.OutOfMemoryError - Java heap space 
at jxl.write.biff.WritableSheetImpl.getRowRecord(WritableSheetImpl.java:1179) 

我已嘗試以下步驟:與

進程失敗

 WorkbookSettings ws = new WorkbookSettings(); 
     ws.setLocale(new Locale("en", "EN")); 
     ws.setUseTemporaryFileDuringWrite(true); 

     WritableWorkbook workbook = Workbook.createWorkbook(new File("tempExcel.xls"),ws); 

所以基本上在一個while循環,從數據庫中ResultSet迭代,然後

s.addCell(new Label(colIndex, rowIndex, value, format));是爲每一行完成的。

我並不放棄如何獲得通過這個問題。在運行此應用程序的env中存在內存限制,因此僅僅爲JVM分配更多RAM不是一種選擇,除非完全沒有其他方式。我將不勝感激這方面的任何反饋。由於

+0

我也有這個相同的問題。谷歌搜索後,我碰到了這個鏈接:http://poi.apache.org/spreadsheet/how-to.html#xssf_sax_api它很容易處理大量的數據。對於我的測試程序,我使用了100,000行和50列。它寫入一個xls文件沒有任何錯誤。我遇到的唯一問題是生成的excel文件的大小。它超過100 MB!除此之外,它的完美! – Joyson 2012-12-11 04:47:14

回答

2

你不能把X磅的東西變成Ÿ大小的包,如果X> Y。

這450萬點的值。如果它們中的很多是字符串,平均大小爲1K字節,那麼您將擁有〜4.5GB的數據。

如果你已經把所有的東西都記在記憶裏,那你就麻煩了。解決方案是將它分塊成小塊,提交它們,然後創建下一個塊。

我不知道是否有任何Web客戶端需要一次這麼多的數據。另一種解決方案是更好的過濾來限制ResultSet的大小。

+1

我同意你的意見。我正努力將它分成更小塊,提交併創建下一個塊。例如,如果一定數量的數據以區塊形式讀取並提交,JExcel仍然需要將工作表讀入內存以添加剩餘的行,並且會再次出現內存錯誤。我無法限制ResultSet,因爲它用於報告目的(業務需求)。有沒有關於如何使用JExcel完成這個任務的例子(大塊閱讀,提交,繼續)...? – ke3pup 2012-08-16 02:09:52

+1

@duffymo是的,這是很好的通用目的答案,但是你沒有看到techventure提到他使用磁盤來緩衝文件內容,我確信它有足夠的可用空間。 – 2012-10-21 17:10:59

相關問題