我编写了一个VSTO DLL来对用户指定的单元格区域执行转换。我是按照以下方式做的:
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 :(得分:4)
您正在为正在阅读和设置的每个单元格进行多次COM调用。将整个范围作为数组一次处理会更有效。
这个问题对选项进行了广泛的讨论:Fastest way to interface between live (unsaved) Excel data and C# objects
使用Excel-DNA和Excel C API,您可以每秒读取和写入一百万个单元格,但我猜想即使是通过COM,如果您读取和写入大型数组,性能也会非常好。< / p>