C#Microsoft.Office.Interop.Excel v15慢

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

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

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

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

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

请find提供以上基准结果的代码:

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中提出了性能问题,但是微软并没有承认这是事实。

谢谢你的帮助!

很难说如何在没有看到任何代码的情况下优化您的应用程序。 有一种方法可以帮助您,而不是select单个单元格,您可以select一个范围。 然后你可以遍历你的c#代码中的数组,这比重复访问interop快。

我不知道为什么2013年比2007年慢,但interos通常很慢,需要安装Excel使用。 由于这些原因,我倾向于避免Interops。

由于Excel电子表格只是由XML构成,所以另一种解决scheme可能是使用库自己编写XML。

OpenXML库显然是一个不错的select,下面是一些有用的链接:

SDK – https://msdn.microsoft.com/zh-cn/library/office/bb448854.aspx

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

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