2010-07-06 134 views
2

我正在使用Apache POI編寫Excel文件。JAVA - 編寫Excel文件時出現Apache POI OutOfMemoryError

我想在它來寫的myResultSet

其具有存儲在字符串[]字段名的字段名(列)中的所有數據。

我有70000行27列

我的代碼:

String xlsFilename = "myXLSX.xlsx"; 
org.apache.poi.ss.usermodel.Workbook myWorkbook = new XSSFWorkbook(); 
org.apache.poi.ss.usermodel.Sheet mySheet = myWorkbook.createSheet("myXLSX"); 
Row currentRow = mySheet.createRow(0); 
for (int k = 0; k < fieldNames.length; k++) { 
    // Add Cells Of Title Of ResultsTable In Excel File 
    currentRow.createCell(k).setCellValue(fieldNames[k]); 
} 

for (int j = 0; j < countOfResultSetRows; j++) { 
    myResultSet.next(); 
    currentRow = mySheet.createRow(j + 1); 
    for (int k = 0; k < fieldNames.length; k++) { 
     currentRow.createCell(k).setCellValue(myResultSet.getString(fieldNames[k])); 
     System.out.println("Processing Row " + j); 
    } 
} 

FileOutputStream myFileOutputStream = new FileOutputStream(xlsFilename); 
myWorkbook.write(myFileOutputStream); 
myFileOutputStream.close(); 

我的問題是,在寫行的程序越來越慢。

當它到達行3500它與異常停止:

異常在線程「線程3」 java.lang.OutOfMemoryError:在java.lang.AbstractStringBuilder Java堆空間 (AbstractStringBuilder.java:45 ) at java.lang.StringBuffer。(StringBuffer.java:79)

看來我內存不足了。

我該如何解決這個問題。

有沒有我的數據存儲到一個臨時文件它們(例如)每1000的方法嗎?

你會建議什麼?

我用JXL和永遠解決不了,要麼(JAVA - Out Of Memory Error while writing Excel Cells in jxl

現在我反正需要XLSX文件有同樣的問題,所以我必須使用POI。

+0

您正在使用哪個應用程序服務器? – 2018-01-17 11:08:00

回答

2

好像有哪些,然後再創建XML格式的數據文件與現有的模板XLSX文件替換該XML的方法。

http://svn.apache.org/repos/asf/poi/trunk/src/examples/src/org/apache/poi/xssf/usermodel/examples/BigGridDemo.java

這並不適用於XLS格式的文件雖然。

+1

使用較新的SXSSF而不是Big Grid Demo會更好,因爲前者比後者更適合 – Gagravarr 2012-01-25 12:32:55

+0

謝謝!我會嘗試,而不是! – ktsujister 2012-01-26 07:18:31

+0

如果您想修改現有的電子表格,BigGridDemo非常有用。 Plain SXSSF是一種只寫格式(從一個空白工作簿或一個已打開的XSSFWorkbook對象開始,基於SAX事件的模型只能讀取,爲了讓一個可以編輯現有文件的類不需要將整個工作簿加載到內存中,將需要使用較低級別的API來編寫XML文件並重新打包工作簿。 – IceArdor 2014-07-17 07:41:31

1

如何讓你的應用程序來使用更多的內存(如-Xmx500m 500 MB)?

+0

已經試過了,沒有變化。 – 2010-07-06 11:49:25

+0

CSV不是一個選項嗎? – 2010-07-06 11:59:28

1

運行程序時分配更多的內存堆:

$ java -Xms256m -Xmx1024m NameOfYourClass 
+0

已經試過了,沒有變化。 – 2010-07-06 11:48:49

1

我去過不止一次。

您是否在應用程序服務器上運行此運行?

我已經在過去作爲被巴勃羅提到做,是增加堆空間,但要確保它被增加了,你正在運行的應用程序服務器。

我這樣做的時候也得真的優化代碼。

因爲你是輸出到.xlsx文件,XML需要相當多的內存。不知道在這種情況下它是否適用於您,但是如果您可以創建正常的.xls,那麼最好將其轉換爲.xlsx文件(當然使用Apache POI)。