C#Microsoft.Office.Interop.Excel v15慢速
我正在处理一个需要编辑excel文件的应用程序,该应用程序执行各种操作,如: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中
- 将粘贴部分从工作表复制到工作表
- 添加/编辑值
- 公式和宏在后台运行
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年的启动会让你收获很多。那么关键的问题不是启动时间吗?