【发布时间】: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 解决方案的建议就是解决之道。