2012-06-18 94 views
0

我在JDK 1.5環境中使用apache POI 3.7,在JVM參數中使用-Xms256m -Xmx512m -XX:PermSize=64M -XX:MaxPermSize=1000M在創建XSSFWorkbook時阻止Apache POI

我寫的代碼讀取這樣的XLSX文件,

File file = new File("C:\\D\\Data Book.xlsx"); 
InputStream inputStream = new FileInputStream(file); 
OPCPackage opcPackage = OPCPackage.open(inputStream); 
XSSFWorkbook workbook = new XSSFWorkbook(opcPackage); 

在它進入空閒狀態的第四行。如果我刪除JVM參數,它會拋出OutOfMemoryError。我的文件大小是6MB。

+0

你怎麼知道它是處於空閒狀態?它能不能繼續處理? –

+0

感謝您的回覆,是的,它沒有繼續。有時它會拋出OutOfMemoryError。 –

+0

這表明a)它不是空閒的,b)你需要在已經指定的內容之上分配額外的內存。 –

回答

1

如果使用OPCPackage不是必要的話,我會去直實例:

InputStream inp = new FileInputStream("C:\\D\\Data Book.xlsx"); 
Workbook wb = WorkbookFactory.create(inp); 

POI Quick Guide

+0

謝謝你們。我通過使用apache POI的事件API解決了這個問題。 http://poi.apache.org/spreadsheet/how-to.html。 –

1

如果你有一個文件,然後通過在使用一個InputStream需要的緩衝所有東西都進入記憶,這會吃掉空間。既然你不需要做那個緩衝,不要!

如果您正在使用最新的POI夜間版本,那麼這很容易。您的代碼變成:

File file = new File("C:\\D\\Data Book.xlsx"); 
OPCPackage opcPackage = OPCPackage.open(file); 
XSSFWorkbook workbook = new XSSFWorkbook(opcPackage); 

否則,它是非常相似:

File file = new File("C:\\D\\Data Book.xlsx"); 
OPCPackage opcPackage = OPCPackage.open(file.getAbsolutePath()); 
XSSFWorkbook workbook = new XSSFWorkbook(opcPackage);