11

我正在使用以下代码:

File file = new File("abc.xlsx");
InputStream st = new FileInputStream(file);
XSSFWorkbook wb = new XSSFWorkbook(st);

xlsx 文件本身有 25,000 行,每行包含 500 列的内容。在调试过程中,我看到我创建 XSSFWorkbook 的第三行,需要很长时间(1 小时!)才能完成此语句。

有没有更好的方法来访问原始 xlsx 文件的值?

4

2 回答 2

22

首先,当您有文件时,不要从 InputStream 加载 XSSFWorkbook!使用 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-22T16:30:29.640 回答
0

考虑使用 POI 的 Streaming 版本。这将根据需要将文件的一个子集加载到内存中。这是处理大文件时推荐的方法。

POI SXSSF

于 2012-06-22T10:46:45.513 回答