带有 xlsm 文件的 Apache POI Java 堆空间

Posted

技术标签:

【中文标题】带有 xlsm 文件的 Apache POI Java 堆空间【英文标题】:Apache POI Java heap space with xlsm file 【发布时间】:2012-09-26 11:56:49 【问题描述】:

我正在尝试执行以下代码将 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 个月。

我在第一行收到此错误"java.lang.OutOfMemoryError: Java heap space"

使用 xls 格式的相同文件 (50 Mo),效果很好。

我无法更改 Xmx 参数,也无法使用 POI 以外的其他 API。

我在其他消息中看到更好的方法是使用SAX API 来解决这种内存问题。

但是,在我的文件中,所有工作表和所有行都不需要以 CSV 格式提取。 这就是为什么我使用“wbk.getNumberOfNames()”来获取所有定义的名称(在名称管理器中)并知道要转换的工作表。

您知道我如何使用 SAX API 访问这些属性吗?

谢谢。

问候。

【问题讨论】:

您是否尝试从文件而不是 InputStream 打开?使用文件比流使用更少的内存 你的意思是这样的:wbk = WorkbookFactory.create(new File("myFile.xlsm"));?我得到同样的错误。 【参考方案1】:

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

【讨论】:

以上是关于带有 xlsm 文件的 Apache POI Java 堆空间的主要内容,如果未能解决你的问题,请参考以下文章

Java操作Excel: POI不能创建xlsm问题的方法(源自StackOverFlow)

来自TXT的Apache POI Excel副本

Java-API-POI-Excel:SXSSFWorkbook Documentation

如何使用 openpyxl 使用宏保存 XLSM 文件

尝试读取 .xlsm 文件时出现 java.lang.NoSuchMethodError

Apache POI解析Excel文件