C# Excel用于计算范围大小

C# Excel用于计算范围大小,c#,excel,vsto,C#,Excel,Vsto,我正在使用VSTO为Excel编写一个性能关键不是一切的外接程序,作为其中的一部分,我正在包装Excel功能,这样我就不会总是从基本VSTO接口获得动态返回 我的一个包装器用于范围接口,为此我计算一个矩形,它根据要包装的范围描述左上角和右下角的单元格。范围可以是一个单元格,也可以是当前工作表的使用范围 所以我计算左上角坐标的代码看起来像 var x = excelRange.Column; var y = excelRange.Row; var columnsCount = excelRang

我正在使用VSTO为Excel编写一个性能关键不是一切的外接程序,作为其中的一部分,我正在包装Excel功能,这样我就不会总是从基本VSTO接口获得动态返回

我的一个包装器用于范围接口,为此我计算一个矩形,它根据要包装的范围描述左上角和右下角的单元格。范围可以是一个单元格,也可以是当前工作表的使用范围

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

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;
计算右下角的坐标看起来像

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;
这很好,也很简单,而且我假设在性能方面也会比较轻松,因为我不想多次从范围接口请求这些值

不幸的是,在分析了我的应用程序并创建了大小不等的2631个矩形(从1x1到10x1)之后,我发现简单地计算这些值大约占用了我的应用程序时间的18%/600ms,所有这些都在对VSTO范围接口的调用中


有没有其他方法可以在不需要4次调用范围接口的情况下获得范围大小,或者我最好只重构代码,这样对于1x1范围,我就不会为此计算矩形?

通过查询范围地址,可以减少调用次数:

string address = excelRange.Address; //Now you get address like "$A1$10"(single cell) or "$A$23:$Z$78"(multiple cells)
您只需要解析地址字符串,这肯定比再调用5次互操作包装器要快得多。在我的测试中,最后速度提高了2-3倍


还有一件事与问题无关-别忘了检查范围内的区域,因为范围可能包括多个范围多个区域选择。

这是我在以我的方式实施之前考虑过的事情,但是它产生了一个额外的问题,在我使用范围限制将地址的字符串表示形式转换为索引到其他地方的数组时,似乎不值得这么麻烦,因为从接口获取一些int非常容易。看起来这可能是我为了减少数量而不得不采取的方法跨互操作的调用数。