使用xlsm文件的Apache POI Java堆空间

时间:2012-09-26 11:56:50

标签: apache heap apache-poi space xlsm

我正在尝试执行以下代码将xlsm文件转换为csv:

//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访问这些属性吗?

感谢。

问候。

1 个答案:

答案 0 :(得分:0)

以下Apache POI代码示例使用SAX解析器将XLSX文件转换为CSV。 http://svn.apache.org/repos/asf/poi/trunk/src/examples/src/org/apache/poi/xssf/eventusermodel/XLSX2CSV.java