C#Microsoft.Office.Interop.Excel v15慢

时间:2015-06-25 10:10:57

标签: c# .net excel office-interop excel-interop

我正在开发一个需要编辑excel文件的应用程序,执行各种操作,如:

     
  • 将工作表中的粘贴部分复制到工作表
  •  
  • 添加/修改值
  •  
  • 公式和宏在后台运行

这是最初使用Excel 2007开发的应用程序,但我现在必须使用Excel 2013.不幸的是,我注意到在安装了Excel 2013而不是Excel 2007的计算机上运行时,速度几乎快了10倍。

因此,我创建了一个非常简单的基准测试应用程序,它随机生成数字并将其写入1000(行)* 15(列)= 15000个单元格。

结果令人失望,因为在Excel 2007中运行大约需要670毫秒,在Excel 2013中运行大约需要3257毫秒。(这是慢5倍)

请找到提供上述基准测试结果的代码:

static void Main(string[] args)
    {
        var stopwatch = new Stopwatch();

        stopwatch.Reset();
        stopwatch.Start();

        var excel = new Application();
        excel.Visible = false;
        excel.DisplayAlerts = false;

        var workbooks = excel.Workbooks;

        var workbook = workbooks.Add(Type.Missing);
        var worksheets = workbook.Sheets;
        var worksheet = (Worksheet)worksheets[1];

        WriteArray2(1000, 15, worksheet);

        workbook.SaveAs(@"c:\temp\Speedtest.xlsx");

        excel.Quit();

        stopwatch.Stop();
        Console.WriteLine("Time elapsed (milliseconds): "+(stopwatch.ElapsedMilliseconds).ToString());
        Console.ReadLine();
        return;
    }

    private static void WriteArray2(int rows, int columns, Worksheet worksheet)
    {
        var data = new object[rows, columns];
        Random r = new Random();

        for (var row = 1; row <= rows; row++)
        {
            for (var column = 1; column <= columns; column++)
            {
                data[row - 1, column - 1] = r.NextDouble()*2000000-1000000;
            }
        }
        var startCell = (Range)worksheet.Cells[1, 1];
        var endCell = (Range)worksheet.Cells[rows, columns];
        var writeRange = worksheet.Range[startCell, endCell];

        writeRange.Value2 = data;
    }
}

您对Excel 2013有任何类似问题吗? 您知道我是否可以尝试优化Excel 2013?

我知道有些人在Excel 2013中提出了性能问题,但微软并没有承认这是事实。

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

很难说如何在不看任何代码的情况下优化应用程序。 一种可能有用的方法是,您可以选择一个范围,而不是选择单个单元格。然后,您可以在c#代码中迭代数组,这比重复访问互操作更快。

我不确定为什么2013比2007慢,但是interops通常很慢,需要安装Excel才能使用。出于这些原因,我倾向于避免使用Interops。

由于Excel电子表格只是由XML组成,另一种解决方案可能是使用库自己编写XML。

OpenXML库显然是一个不错的选择,这里有一些有用的链接:

SDK - https://msdn.microsoft.com/en-us/library/office/bb448854.aspx

教程 - https://msdn.microsoft.com/en-us/library/office/hh180830%28v=office.14%29.aspx

但是我认为在OpenXML中执行宏可能很困难。但有人设法做到了:https://stackoverflow.com/a/21789643/3209889