2012-09-26 85 views
1

的Apache POI的Java堆空間,我想執行以下代碼到一個XLSM文件轉換爲csv:與XLSM文件

//Workbook wbk = new HSSFWorkbook(new FileInputStream(new File("myFile.xls"))); 
Workbook wbk = new XSSFWorkbook(new FileInputStream(new File("myFile.xlsm"))); 

for (int i = 0; i < wbk.getNumberOfNames(); i++) { 

    if (wbk.getNameAt(i).getNameName().startsWith("START\\")) { 

     // Get SheetName 
     sheetName = wbk.getNameAt(i).getSheetName(); 

     // Get csv Filename 
     csvFilename = generateFileName(wbk.getNameAt(i).getNameName(), currentDate); 

     // Starting row index for this sheet 
     startingRowIndex = getStartingRowIndex(wbk, i); 

     // Max column index for this sheet 
     maxColumnIndex = getMaxColumnIndex(wbk, wbk.getSheet(sheetName)); 

     // Convert sheet to csv 
     toCSV(csvFilename, startingRowIndex, maxColumnIndex, wbk, sheetName); 
    } 
} 

-Xmx參數設置好的1024和我使用的是xslm文件。 此文件是15 Mo.

我在第一行得到這個錯誤"java.lang.OutOfMemoryError: Java heap space"

使用xls格式(50 Mo)中的同一個文件,它效果很好。

我無法更改Xmx參數,也無法使用POI之外的其他API。

我在別人的消息中讀到,更好的方法是使用SAX API來處理這種內存問題。

但是,在我的文件中,所有工作表和所有行都不需要以CSV格式提取。 這就是爲什麼我使用「wbk.getNumberOfNames()」來獲取所有定義的名稱(在名稱管理器中)並知道要轉換的圖紙。

你知道我如何使用SAX API訪問這些屬性?

謝謝。

問候。

+0

您是否嘗試從File而不是InputStream打開?使用文件使用的內存少於流 – Gagravarr

+0

您的意思是:'wbk = WorkbookFactory.create(new File(「myFile.xlsm」));'?我犯了同樣的錯誤。 – krugar

回答