我正在使用 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 文件的替代库的建议。
看起来 XLSX 支持在 NPOI 中相当新,而且它还无法处理大文件。
尝试了几个库后,EPPlus能够顺利处理大型 XLSX 文件,因此我最终决定使用两个库来读取 Excel 文件,即用于 XLS 的 NPOI 和用于 XLSX 的 EPPlus。
作为替代库的建议,一个好的库是 Apache POI。我已将它广泛用于 XLSX 和 XLS 文件,并且效果很好。这是对您的文件进行快速测试的要点。
Apache POI 唯一不涵盖的格式是旧格式的 XML 文件,可以使用 Xelem 来代替。
您可以使用XlsxHelper。 这是 NuGet 链接。 XlsxHelper 旨在读取大型 Excel Xlsx 文件。
注意:在处理大文件时,我们应该记住,并非所有数据都加载到 RAM 中。避免在 IEnumerable 上调用
ToList()
或 ToArray()
。以流式处理记录(读取行 -> 处理行 -> 读取行 -> 处理行)。