Excel VSTO计算范围大小

时间:2015-10-28 09:00:15

标签: c# excel vsto

我正在使用VSTO为Excel编写一个性能关键(不是所有内容)加载项,并且作为其中的一部分我正在包装Excel功能,因此我并不总是以dynamic结束从基础VSTO接口返回。

我的一个包装器用于Range接口,为此我正在计算一个Rectangle,它根据Range来描述左上角和右下角的单元格。 Range可能只是一个单元格,也可能是当前工作表的使用范围。

所以我的计算左上角坐标的代码看起来像......

var x = excelRange.Column;
var y = excelRange.Row;

并计算右下角坐标看起来像......

var columnsCount = excelRange.Columns.Count;
var rowsCount = excelRange.Rows.Count;

var x = columnsCount * topLeftCoordinate.X;
var y = rowsCount * topLeftCoordinate.Y;

这很简单,我认为在性能方面也相对无痛,因为我不想多次从Range接口请求这些值。

不幸的是,在分析我的应用程序并创建不同大小的2631个矩形(从1x1到10x1)之后,我可以看到简单地计算这些值占用了我的应用程序时间的大约18%/ 600ms,所有这些都在VSTO的调用中Range界面。

有没有其他方法可以获得范围大小而无需4次调用Range接口,或者我最好简单地重构我的代码,以便1x1范围我不为此计算矩形?

1 个答案:

答案 0 :(得分:0)

通过查询范围地址可以减少呼叫次数:

string address = excelRange.Address; //Now you get address like "$A1$10"(single cell) or "$A$23:$Z$78"(multiple cells)

你所需要的只是解析地址字符串,这肯定比对interop包装器再调用5次要快得多。在我的测试中,它最终快了2-3倍。

还有一个与问题无关的事情 - 不要忘记检查范围内的区域,因为范围可能包含多个范围(多个区域选择)。