2012-09-26 58 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

回答

相关问题