'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。
我正在使用 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。