2012-07-23 106 views
1

我写了一个VSTO DLL来对用户指定的单元格范围执行转换。我在下面的方式这样做:VSTO速度问题

Globals.ThisAddIn.Application.EnableEvents = false; 

int totRows=inputRange.Rows.Count; 
int totCols=inputRange.Columns.Count; 

for (int i = 1; i <= totRows; i++) { 
    for (int j = 1; j <= totCols; j++) { 
    if (((Range)inputRange.Cells[i, j]).Value2 != null) { 
     ((Range)outputSheet.Cells[i, j]).Value2 = MyTransform(((Range)inputRange.Cells[i, j]).Value2); 
    } 
    } 
} 

Globals.ThisAddIn.Application.EnableEvents = true; 

这种方法可以让我修改约150万个细胞/小时(我不计算由MyTransform()所消耗的时间),这在我看来是非常慢。

是否有更高效的方式来读/写VSTO中的单元?

如果不是,将其转换为XLL(可能使用Excel-DNA)是否更快?任何猜测多少?

+0

我不得不猜测你正在线程上运行此代码以防止UI冻结。在这种情况下,你穿过公寓边界访问这些单元,这很慢。不禁用自动单元格计算也使其非常慢。 – 2012-07-23 14:57:38

+0

没有线程,界面或多或少冻结长时间运行。尽管没有计算的单元格(它是一个名称和地址列表),我会尝试禁用自动单元格计算。 – 2012-07-23 15:32:05

回答

4

您正在为您正在阅读和设置的每个单元进行多个COM调用。将整个范围一次处理为数组效率更高。

这个问题有选项进行了广泛讨论:Fastest way to interface between live (unsaved) Excel data and C# objects

随着Excel-DNA和Excel C API,你可以读取和写入每秒百万个细胞,但如果你阅读和写作,我通过COM甚至猜测作为一个大阵,表现会相当不错。

+0

谢谢,那正是我所需要的。 – 2012-07-23 17:37:27