Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#Microsoft.Office.Interop.Excel v15慢速_C#_.net_Excel_Office Interop_Excel Interop - Fatal编程技术网

C#Microsoft.Office.Interop.Excel v15慢速

C#Microsoft.Office.Interop.Excel v15慢速,c#,.net,excel,office-interop,excel-interop,C#,.net,Excel,Office Interop,Excel Interop,我正在处理一个需要编辑excel文件的应用程序,该应用程序执行各种操作,如: 将粘贴部分从工作表复制到工作表 添加/编辑值 公式和宏在后台运行 这是一个最初使用Excel 2007开发的应用程序,但现在我必须使用Excel 2013。不幸的是,我注意到在安装了Excel2013而不是Excel2007的机器上运行时,速度几乎慢了10倍 因此,我创建了一个非常简单的基准测试应用程序,它随机生成数字并将其写入1000(行)*15(列)=15000个单元格 结果令人失望,因为在Excel2007中

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

  • 将粘贴部分从工作表复制到工作表
  • 添加/编辑值
  • 公式和宏在后台运行
这是一个最初使用Excel 2007开发的应用程序,但现在我必须使用Excel 2013。不幸的是,我注意到在安装了Excel2013而不是Excel2007的机器上运行时,速度几乎慢了10倍

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

结果令人失望,因为在Excel2007中运行大约需要670毫秒,在Excel2013中运行大约需要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;
    }
}
static void Main(字符串[]args)
{
var stopwatch=新秒表();
秒表复位();
秒表。开始();
var excel=新应用程序();
excel.Visible=false;
excel.DisplayAlerts=false;
var workbooks=excel.workbooks;
var工作簿=工作簿.Add(Type.Missing);
var工作表=工作簿.工作表;
var工作表=(工作表)工作表[1];
书面答复2(1000、15、工作表);
workbook.SaveAs(@“c:\temp\Speedtest.xlsx”);
excel.Quit();
秒表;
WriteLine(“经过的时间(毫秒):”+(stopwatch.elapsedmillesons.ToString());
Console.ReadLine();
返回;
}
私有静态void WriteArray2(int行、int列、工作表)
{
var data=新对象[行、列];
随机r=新随机();

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

我不知道为什么2013年的速度比2007年慢,但Interop通常相当慢,需要安装Excel才能使用。出于这些原因,我倾向于避免Interop

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

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

SDK-

教程-


然而,我认为在OpenXML中执行宏可能会很困难。但是有人已经成功地做到了:

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

我不知道为什么2013年的速度比2007年慢,但Interop通常相当慢,需要安装Excel才能使用。出于这些原因,我倾向于避免Interop

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

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

SDK-

教程-


然而,我认为在OpenXML中执行宏可能会很困难。但是有人成功地做到了这一点:

谢谢你的建议Magnus。我以前使用过OpenXML,可能会给出一个解决方案。然而,这里的问题是,使用Interop管理excel的层非常成熟,经过了良好的测试,在我们的服务器上运行得非常好Excel 2007。一旦我们将Excel升级到v2013,它就开始出现问题。为了将其更改为尝试OpenXML(仍然不能保证它会工作),我们将不得不花费大量的时间和预算来研究、开发和测试!感谢您的建议Magnus。我以前使用过OpenXML,可能会给出一个解决方案。然而,这里的问题是,使用Interop管理excel的层非常成熟,经过了良好的测试,并且在使用excel 2007的服务器中表现非常好。一旦我们升级将Excel添加到v2013后,它开始出现错误。为了将其更改为尝试OpenXML(仍然不能保证它会工作),我们将不得不花费大量的时间和预算来研究、开发和测试!你能展示一下速度慢的代码吗?在你的终端需要多长时间?热启动是:在Excel 2013中运行3257毫秒,在Excel 2007中运行670毫秒。如果你忽略应用程序启动时间,那么需要多长时间?你有运行加载项吗?那么2007现在变慢了,在2013年的启动中,你获得了很多。那么,关键问题不是启动时间吗?你能展示一下缓慢的代码吗?在你的终端需要多长时间?热启动是:在Excel 2013中运行3257毫秒,在Excel 2007中运行670毫秒。如果你忽略应用程序启动时间,那么需要多长时间?你有吗e插件的运行?所以2007年的速度变慢了,而2013年的启动会让你收获很多。那么关键的问题不是启动时间吗?