2015-10-28 55 views
0

我正在使用VSTO編寫一個性能至關重要的(不是所有內容)Excel表格,並且作爲其中的一部分,我正在包裝Excel功能,以便我不總是以dynamic從基本VSTO接口返回。Excel 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%/ 600ms,所有這些都在調用VSTO Range接口。

是否有另一種獲得範圍大小的方式,而不需要4次調用Range接口,或者我更好地簡單地重構我的代碼,以便對於1x1範圍我不計算矩形?

回答

0

有可能通過查詢範圍的地址做更少的調用:

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

所有你需要的是解析地址字符串,這是肯定要比做5個呼叫互操作包裝速度更快。在我的測試中,最終速度提高了2-3倍。

還有一件事與問題無關 - 不要忘記檢查範圍內的區域,因爲範圍可能由多個範圍組成(多區域選擇)。

+0

這是我在考慮過之前考慮過的事情,但它創建了一個額外的問題,將Address的字符串表示轉換爲索引(因爲我使用Range範圍來限制從別處索引到一個數組中)似乎沒有什麼價值,因爲從界面中獲得一些'int'是很容易的。看起來這可能是我必須去減少的方式在interop上的呼叫數量。 –