创建XSSFWorkbook时阻止Apache POI

时间:2012-06-18 15:44:22

标签: java apache-poi

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

我编写代码来读取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。

3 个答案:

答案 0 :(得分:1)

如果使用OPCPackage不是必需的,那么我会直接进行实例化:

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

请参阅POI Quick Guide

答案 1 :(得分: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);

答案 2 :(得分:0)

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

SXSSFWorkbook workbook = new SXSSFWorkbook(100);

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