【问题标题】:'OutOfMemoryException' reading 20mb XLSX file'OutOfMemoryException' 读取 20mb XLSX 文件
【发布时间】:2015-11-12 11:45:42
【问题描述】:

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

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

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

做一些研究,我found out 发现,奇怪的是,从文件而不是流加载工作簿会减少 POI 的内存消耗。与我提供的使用 Files 的 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


【解决方案1】:

似乎 XLSX 支持在 NPOI 中相当新,它根本无法处理大文件。

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2017-01-28
      • 2023-03-22
      • 1970-01-01
      • 2015-09-30
      • 2021-08-04
      • 2019-05-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多