的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