慢Microsoft.Office.Interop.Excel

时间:2015-07-16 07:33:04

标签: c# excel performance com-interop excel-interop

在我的应用程序中,我使用C#代码自动生成Excel文件。此应用程序用于多个环境(计算机)。在一台计算机上生成此文件的速度比在所有其他计算机上慢。

例如,以下代码在该计算机上慢了90%:

        using Excel = Microsoft.Office.Interop.Excel;
        ...

        Microsoft.Office.Interop.Excel.ApplicationClass xlApp = new Excel.ApplicationClass();
        Excel.Workbooks workbooks = xlApp.Workbooks;
        Excel.Workbook xlBook = workbooks.Open(@"C:\a\a.xlsx", 0, false, 6, "", "", true, Microsoft.Office.Interop.Excel.XlPlatform.xlWindows, "\t", false, false, 0, true, 1, 0);

        Excel.Worksheet xlSheet = (Excel.Worksheet)xlBook.Worksheets.get_Item("Sheet1");

        Excel.Range  oRange = xlSheet.get_Range(xlSheet.Cells[1, 1], xlSheet.Cells[2, 2]);

        object[,] a = new object[1, 1];
        a[0, 0] = "1";
        oRange.Value2 = a;

        xlBook.Save();

        xlApp.Visible = false;
        xlApp.Workbooks.Close();

get_Range方法在该机器上慢了2倍。

有谁知道如何找出什么会减慢Excel Interop COM对象的通信速度以及如何使其更快?

1 个答案:

答案 0 :(得分:1)

有很多因素可能会影响互操作代码的性能:

  • Excel版本
  • .NET Framework版本
  • SDK版本(如果使用VSTO)
  • 服务包的存在/不存在
  • 机器的硬件规格
  • 执行时的资源使用情况(RAM,CPU,I / O等)
  • 计算机上安装的其他COM应用程序的数量

有一些方法可以加速Excel互操作代码,例如隐藏窗口(您已经这样做了)并在操作期间将ScreenUpdating属性设置为false。

但是,说到这一切,COM互操作基本上是缓慢而笨重的。这是使用Excel文档的最低效方法。你最好使用OpenXML SDK来做这件事。它是100%托管代码,没有外部依赖项(甚至不需要在目标计算机上安装Office)。