我在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。
答案 0 :(得分:1)
如果使用OPCPackage
不是必需的,那么我会直接进行实例化:
InputStream inp = new FileInputStream("C:\\D\\Data Book.xlsx");
Workbook wb = WorkbookFactory.create(inp);
答案 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是将保留在内存中并实时处理的默认行数。