【问题标题】:Slow Performance When Reading Excel读取 Excel 时性能缓慢
【发布时间】:2015-11-09 05:42:12
【问题描述】:

我想读取excel文件但是这样太慢了。我应该使用什么模式来更快地读取 excel 文件。我应该尝试 csv 吗?

我正在使用以下代码:

ApplicationClass excelApp = excelApp = new ApplicationClass();
Workbook myWorkBook = excelApp.Workbooks.Open(@"C:\Users\OWNER\Desktop\Employees.xlsx");
Worksheet mySheet = (Worksheet)myWorkBook.Sheets["Sheet1"];

for (int row = 1; row <= mySheet.UsedRange.Rows.Count; row++)
{
    for (int col = 1; col <= mySheet.UsedRange.Columns.Count; col++)
    {
        Range dataRange = (Range)mySheet.Cells[row, col];
        Console.Write(String.Format(dataRange.Value2.ToString() + " "));
    }
    Console.WriteLine();
}

excelApp.Quit();

【问题讨论】:

  • 您似乎正在使用 Excel Interop 来读取 Excel 文件。这不是推荐(也不支持)的方式。请改用 OpenXML 进行直接文件访问。有很多包装库可以使用它。 stackoverflow.com/a/23104151/1808494

标签: c#


【解决方案1】:

Excel Data Reader

如果您只关心阅读,那么轻巧且速度非常快。

【讨论】:

    【解决方案2】:

    您的程序运行缓慢的原因是您使用 Excel 打开 Excel 文件。每当您对文件执行任何操作时,都必须执行 COM+ 互操作,这非常慢,因为您必须在两个不同的进程之间传递内存。

    Microsoft 已不再支持使用 Excel 互操作读取 .xlsx 文件。为此,他们专门发布了 OpenXML 库。

    我建议您使用包装库来使用 OpenXML,因为 API 非常复杂。您可以查看此 SO 以了解如何正确使用它。

    open xml reading from excel file

    【讨论】:

      【解决方案3】:

      您正在通过 excel 互操作访问 Excel 文件。通过逐个单元地读取,您正在做很多 P/Invoke,这不是很高效。

      您可以读取范围内的数据,而不是逐个单元格地读取数据。这会将数据加载到内存中,您可以更快地迭代它。 (例如,尝试逐列加载。)

      顺便说一句:您可以使用一些库,例如直接读取 excel 文件的 http://epplus.codeplex.com

      【讨论】:

      • 这并不能解释为什么一次读取一个单元格很慢(Invoke/P 和跨进程封送大量内存)。
      • 您的编辑根本与您的答案无关。 EPPlus 解决了这个问题,根本不互操作 Excel,直接使用 OpenXML 读取文件。
      猜你喜欢
      • 2014-11-08
      • 1970-01-01
      • 2011-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-19
      • 2018-09-20
      • 1970-01-01
      相关资源
      最近更新 更多