“OutOfMemoryException”读取 20mb XLSX 文件

问题描述 投票:0回答:3

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

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

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

做了一些研究,我发现,奇怪的是,从文件而不是流加载工作簿会导致 POI 消耗更少的内存。与我提供的使用文件的 Java 示例最接近的 C# 等效项如下:

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

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

NPOI 有内置的东西来处理大型 XLSX 文件吗?

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

c# excel out-of-memory apache-poi npoi
3个回答
3
投票

看起来 XLSX 支持在 NPOI 中相当新,而且它还无法处理大文件。

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


0
投票

作为替代库的建议,一个好的库是 Apache POI。我已将它广泛用于 XLSX 和 XLS 文件,并且效果很好。这是对您的文件进行快速测试的要点

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


0
投票

您可以使用XlsxHelper这是 NuGet 链接。 XlsxHelper 旨在读取大型 Excel Xlsx 文件。

注意:在处理大文件时,我们应该记住,并非所有数据都加载到 RAM 中。避免在 IEnumerable 上调用

ToList()
ToArray()
。以流式处理记录(读取行 -> 处理行 -> 读取行 -> 处理行)。

© www.soinside.com 2019 - 2024. All rights reserved.