首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Interop Excel很慢

Interop Excel很慢
EN

Stack Overflow用户
提问于 2014-04-22 06:29:30
回答 4查看 2.7K关注 0票数 6

我正在编写一个应用程序来打开Excel表并读取它。

代码语言:javascript
复制
MyApp = new Excel.Application();
MyBook = MyApp.Workbooks.Open(filename);
MySheet = (Excel.Worksheet)MyBook.Sheets[1]; // Explict cast is not required here
lastRow = MySheet.Cells.SpecialCells(Excel.XlCellType.xlCellTypeLastCell).Row;
MyApp.Visible = false;

这大约需要6-7秒才能完成,这与interop Excel正常吗?

还有比这更快的读取Excel的方法吗?

代码语言:javascript
复制
string[] xx = new string[lastRow];
for (int index = 1; index <= lastRow; index++)
{
   int maxCol = endCol - startCol;
   for (int j = 1; j <= maxCol; j++)
   {
      try
      {
         xx[index - 1] += (MySheet.Cells[index, j] as Excel.Range).Value2.ToString();
      }
      catch
      {    
      }

      if (j != maxCol) xx[index - 1] += "|";
   }
}
MyApp.Quit();
System.Runtime.InteropServices.Marshal.ReleaseComObject(MySheet);
System.Runtime.InteropServices.Marshal.ReleaseComObject(MyBook);
System.Runtime.InteropServices.Marshal.ReleaseComObject(MyApp);
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-04-22 06:40:33

这个答案只是关于你问题的第二部分。您正在使用的范围很多,这不是预期的,而且确实非常缓慢。

首先读取整个范围,然后按如下方式迭代结果:

代码语言:javascript
复制
var xx[,] = (MySheet.Cells["A1", "XX100"] as Excel.Range).Value2;
for (int i=0;i<xx.getLength(0);i++)
{
    for (int j=0;j<xx.getLength(1);j++)
    {
         Console.WriteLine(xx[i,j].toString());
    }
}

这样会快得多!

票数 2
EN

Stack Overflow用户

发布于 2014-04-22 16:23:56

在@RvdK的回答后,互操作是缓慢的。

为什么这么慢?

这是因为它是如何工作的。从.NET发出的每个调用都必须封送到本地COM代理--必须从一个进程(应用程序)封送到COM服务器(Excel) (通过Windows内核内部的IPC ),然后将其从服务器的本地代理转换(分派)为本机代码,其中从OLE自动化兼容类型封送参数到本机类型,检查它们的有效性并执行函数。结果表明,该函数通过两个不同的过程之间的几个层,返回的方式大致相同。

因此,每个命令的执行成本都很高,执行得越多,整个过程就越慢。您可以在web上找到大量的文档,因为COM是一个古老且工作良好的标准(在某种程度上使用Visual 6)。

这篇文章的一个例子是:http://www.codeproject.com/Articles/990/Understanding-Classic-COM-Interoperability-With-NE

有更快的阅读方式吗?

  1. ClosedXML可以使用微软的OpenXml SDK读写Excel文件(甚至是公式、格式等),参见:https://closedxml.codeplex.com/wikipage?title=Finding%20and%20extracting%20the%20data&referringTitle=Documentation
  2. Excel数据读取器声称能够同时读取遗留的和新的Excel数据文件,我没有亲自尝试过,请看这里:https://exceldatareader.codeplex.com/
  3. 另一种更快地读取数据的方法是使用Excel自动化将表转换为您可以轻松理解的数据文件,并且无需互操作层进行批处理(例如,XML、CSV)。This的答案显示了如何做到这一点。
票数 5
EN

Stack Overflow用户

发布于 2014-04-22 06:32:40

简短的回答:正确,互操作很慢。(同样的问题,花了几秒钟读了300行.

为此使用一个库:

  • http://epplus.codeplex.com/
  • http://npoi.codeplex.com/
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23212027

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档