【问题标题】:Load large amount of excel data with EPPlus使用 EPPlus 加载大量 Excel 数据
【发布时间】:2015-01-19 22:36:56
【问题描述】:

我有一个基本的 winforms 应用程序,用户可以上传一个 excel 文件 (.xlsx),我想读取这个文件的内容,所以我正在使用 EPPlus。

问题是,我正在尝试加载一个非常大的 excel 文件的内容,它有 7 个选项卡,一个选项卡的行数超过 200k,另一个选项卡的行数超过 70k。其他 5 个总计约 50k。

这些文件也只会继续变大。(最终目标)由于我要导入数据,读取数据,并且根据我拥有的规则/数据,我需要将数据写回 excel 文件并将其导出。

我在使用 EPPlus 实现数据加载时遇到问题。

这里是代码

var file = new FileInfo(filePath);
using (var package = new ExcelPackage(file))
{
    try
    {
        // Get the work book in the file
        ExcelWorkbook workBook = package.Workbook; //Hangs here for about 2 mins
        if (workBook != null)
        {
            if (workBook.Worksheets.Count > 0)
            {
                // Get the first worksheet
                ExcelWorksheet currentWorksheet = workBook.Worksheets.First();
                // gets the currentWorksheet but doesn't evaluate anything...

            }
        }
    }
    catch (Exception ex)
    {
        throw ex;
    }
}

代码在 package.workbook 行上挂起大约 2 分钟。然后它进入获取 currentWorkSheet 的 if,如果我在手表中查看该变量的内容,则实际上没有加载任何内容:

函数评估被禁用,因为之前的函数评估超时。您必须继续执行才能重新启用函数评估。

我查看了来自 EPPlus 的 link,它显示加载大文件的唯一问题是从上到下和从左到右加载,他们说超过 5,000 个。我有更多的东西,所以我只是想知道这是否可以通过 EPPlus 实现?

此外,我做了一些谷歌搜索,大多数问题是他们无法在服务器上打开大型 excel 文件,而他们可以在本地...

我也开始研究 Open XML SDK,它似乎在性能方面更好,但在代码方面也更难使用。

【问题讨论】:

  • 这不是我的工作,使用excel。我只是拿起一个项目,它被遗漏了。我从来没有使用过excel作为数据库。但是,关于我的回答,使用 EPPlus 确实适用于我打算使用它的目的。我只是以不适当的方式访问单元格。另外,我反对 Open XML 的意思是(从我的角度来看)它看起来比 EPPlus 更难编码。再说一次,我也不是很熟悉,所以我不知道。如果我需要走那条路,我会学到的。
  • 如果您对文件的生成方式有任何控制权,并且工作簿本质上是平面文件,即不涉及函数/宏/格式,只是数据转储,您最好使用几个单独的 .csv 文件,而不是带有单独工作簿的 excel 文件。如果做不到这一点,@DJKRAZE 提出的敲定 OpenXML 解决方案的建议就是解决之道。

标签: c# excel winforms epplus


【解决方案1】:

这些听起来像是相当大的数据集,所以您可能想阅读以下内容:

EPPlus Large Dataset Issue with Out of Memory Exception

基本上,您可以用“更大”的数据集耗尽 RAM。但它不仅仅是增加大小的行数,还有每个单元格的列和内容。字符串通常会比数字占用更多的空间,因此有时很难预测 EPP 何时开始出现内存问题。传闻最新版本的 EPP 更好,但我自己没有测试过。

似乎您可以根据您的 cmets 使其正常工作,这很好,但请记住内存限制。我同意你的看法——在 Open XML 中做这件事不是一个简单的练习。

【讨论】:

  • 感谢您,幸运的是我确实发现了问题并能够解决它,但我会记住这一点。谢谢!
  • 是否可以通过分块加载和处理文件来绕过内存限制,使用类似于 Linq 的 Skip(x)Take(x) 方法,或者是否将整个工作簿加载到内存中?
  • @DanS。我试过了(可能在那篇链接的帖子中的回答中提到了它)。不走运 - 一旦你在 EPP 中打开文件,无论如何它都会被加载。就像我说的那样,也许他们在仍处于测试阶段的最新版本中发现了这一点 - 如果他们做到了,那就太好了。
  • @Ernie 你确实提到了。周五我的阅读理解能力下降。
  • @Ernie - 我通过读取分块加载数据解决了内存问题。我有 90K+ 记录,一次加载 10K,没有内存不足。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-27
  • 1970-01-01
相关资源
最近更新 更多