【问题标题】:Excel VSTO calculating Range sizeExcel VSTO 计算范围大小
【发布时间】:2015-10-28 18:38:09
【问题描述】:

我正在使用 VSTO 为 Excel 编写一个性能关键(不是全部)加载项,作为其中的一部分,我正在打包 Excel 功能,这样我就不会总是以 dynamic 结束返回基本 VSTO 接口。

我的一个包装器是用于Range 接口的,为此我正在计算一个矩形,它基于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%/600 毫秒左右,所有这些都在对 VSTO 的调用中Range接口。

是否有另一种方法可以在不需要 4 次调用 Range 接口的情况下获得范围大小,还是我最好简单地重构我的代码,以便对于 1x1 范围我不为此计算矩形?

【问题讨论】:

    标签: c# excel vsto


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 这是我在以我的方式实现它之前考虑过的事情,但它产生了一个额外的问题,即将Address 的字符串表示形式转换为索引(因为我使用Range 限制从其他地方索引到数组中)似乎不值得麻烦,因为从界面中获取一些 int 很容易。看起来这可能是我必须这样做的方式只是为了减少跨互操作的调用次数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-19
    • 1970-01-01
    相关资源
    最近更新 更多