的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訪問這些屬性?
謝謝。
問候。
您是否嘗試從File而不是InputStream打開?使用文件使用的內存少於流 – Gagravarr
您的意思是:'wbk = WorkbookFactory.create(new File(「myFile.xlsm」));'?我犯了同樣的錯誤。 – krugar