'OutOfMemoryException' 读取 20mb XLSX 文件

'OutOfMemoryException' reading 20mb XLSX file

我正在使用 NPOI 来处理 Excel 个文件。这是我阅读文件的方式:

using (FileStream stream = File.OpenRead(excelFilePath))
{
    IWorkbook wb = WorkbookFactory.Create(stream);
    ...
}

但是,对于任何大于几兆字节的 XLSX 文件,它会导致内存使用量激增至大约 1GB,并最终引发 OOM 异常。

通过一些研究,我 found out 奇怪的是,从文件而不是流加载工作簿会导致 POI 占用更少的内存。与我想出的使用文件的提供的 Java 示例最接近的 C# 等效如下:

OPCPackage pkg = OPCPackage.Open(new FileInfo(excelFilePath));
XSSFWorkbook wb = new XSSFWorkbook(pkg);

但它似乎使用相同的底层实现,因为内存使用仍然相同并导致 OutOfMemory 异常。

NPOI 是否有任何用于处理大型 XLSX 文件的内置功能?

也欢迎就可以处理 XLS 和 XLSX 文件的替代库提出建议。

作为替代库的建议,一个好的建议是 Apache POI. I've used it extensively for both XLSX and XLS files and it does the job well. Here's a gist 对您的文件进行快速测试。

Apache POI 唯一不涵盖的格式是旧格式 XML 文件,可以使用 Xelem 代替。

似乎 XLSX 支持在 NPOI 中是相当新的,它还不能处理大文件。

尝试了几个库后,EPPlus 能够顺利处理大型 XLSX 文件,所以我最终决定使用两个库来读取 Excel 文件,XLS 的 NPOI 和XLSX 的 EPPlus。