0

我需要将 XLSM 文件元数据读取到小于 4 MB 的文件以下说明可以正常工作:

try {
OPCPackage pkg = OPCPackage.open (new FileInputStream ("C:\\Path to file.xlsm"));
XSSFWorkbook XSSFWorkbook = new document (pkg);
documento.getProperties poixmlProperties = ();
...
} catch (Exception ex) {
...
} finally {
...
}

对于大于 4 MB 的文件不运行第二行(XSSFWorkbook document=new XSSFWorkbook (pkg)),直接跳转到 finally 块而不给出任何错误。

4

1 回答 1

0

首先,当你有一个 File 对象时不要使用 InputStream!使用 InputStream 意味着 POI 必须将您的整个内容缓冲到内存中,而使用 File 它可以将其保留在磁盘上直到需要。如POI 文档中所述,改为使用以下方式打开:

OPCPackage pkg = OPCPackage.open(new File("file.xlsx"));

其次,当您想要的只是元数据时,您似乎正在打开整个 Excel 结构并将其解析到内存中。不!启动 XSSFWorkbook 需要相当多的处理和内存,如果您只关心元数据,则不需要这些,元数据位于文件的单独区域

相反,只需加载属性本身,然后使用它。您的最终代码将类似于:

OPCPackage pkg = OPCPackage.open(new File("file.xlsx"));
POIXMLProperties props = new POIXMLProperties(pkg);
System.out.println("The title is " + props.getCorePart().getTitle());

这应该只加载文件总大小的一小部分作为内存使用

于 2013-08-27T23:07:02.210 回答