0

我在 JDK 1.5 环境中使用 apache POI 3.7 并-Xms256m -Xmx512m -XX:PermSize=64M -XX:MaxPermSize=1000M作为 JVM 参数。

我写了这样的代码来读取 xlsx 文件,

File file = new File("C:\\D\\Data Book.xlsx");
InputStream inputStream = new FileInputStream(file);
OPCPackage opcPackage = OPCPackage.open(inputStream);
XSSFWorkbook workbook = new XSSFWorkbook(opcPackage);

在第四行,它进入空闲状态。如果我删除 JVM 参数,它会抛出OutOfMemoryError. 我的文件大小是 6MB。

4

3 回答 3

1

如果您有一个文件,则将其传入。使用 InputStream 需要将所有内容缓冲到内存中,这会占用空间。由于您不需要进行缓冲,因此不要!

如果您使用 POI 的最新夜间版本运行,那么这非常容易。您的代码变为:

File file = new File("C:\\D\\Data Book.xlsx");
OPCPackage opcPackage = OPCPackage.open(file);
XSSFWorkbook workbook = new XSSFWorkbook(opcPackage);

否则,它非常相似:

File file = new File("C:\\D\\Data Book.xlsx");
OPCPackage opcPackage = OPCPackage.open(file.getAbsolutePath());
XSSFWorkbook workbook = new XSSFWorkbook(opcPackage);
于 2012-06-19T22:47:53.513 回答
1

如果 usingOPCPackage不是必需的,那么我会直接实例化:

InputStream inp = new FileInputStream("C:\\D\\Data Book.xlsx");
Workbook wb = WorkbookFactory.create(inp);

请参阅POI 快速指南

于 2012-06-18T19:21:57.463 回答
0

很难相信这个问题已经有将近 8 年没有得到回答了。我已经对类似问题之一发布了相同的答案,让我也将其发布在这里。而不是 XSSFWorkbook(将整个 Excel 工作簿保存在内存中)尝试使用非常高效和高性能的流式 SXSSFWorkbook 类,如下所示:

SXSSFWorkbook workbook = new SXSSFWorkbook(100);

其中 100 是将保留在内存中并实时处理的默认行数。

于 2020-02-03T16:04:38.947 回答