【问题标题】:C# Microsoft.Office.Interop.Excel v15 slowC# Microsoft.Office.Interop.Excel v15 慢
【发布时间】:2015-06-25 20:08:12
【问题描述】:

我正在开发一个应用程序,该应用程序需要编辑一个执行各种操作的 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 中提出了性能问题,但 Microsoft 并未承认这是事实。

感谢您的帮助!

【问题讨论】:

  • 能不能展示下慢的代码?
  • 你最后需要多长时间?
  • 热启动为:在 Excel 2013 中运行 3257 毫秒,在 Excel 2007 中运行 670 毫秒。
  • 如果省略应用程序启动时间,那需要多长时间?你有插件在运行吗?
  • 所以2007现在变慢了,你在2013的启动中收获很多。那么关键问题不是启动时间吗?

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


【解决方案1】:

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

虽然我不确定为什么 2013 比 2007 慢,但互操作通常很慢,需要安装 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

【讨论】:

  • 感谢您的建议马格努斯。我以前使用过 OpenXML,可能会给出一个解决方案。但是,这里的问题是,使用 Interop 管理 excel 的层非常成熟,经过良好测试,并且在我们的 Excel 2007 服务器中执行得非常好。一旦我们将 Excel 升级到 v2013,它就开始出现问题。为了改变它来尝试OpenXML(仍然不能保证它会起作用),我们将不得不花费大量的时间和预算来研究、开发和测试!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多