2012-07-23 108 views
1

我寫了一個VSTO DLL來對用戶指定的單元格範圍執行轉換。我在下面的方式這樣做:VSTO速度問題

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

我不得不猜測你正在線程上運行此代碼以防止UI凍結。在這種情況下,你穿過公寓邊界訪問這些單元,這很慢。不禁用自動單元格計算也使其非常慢。 – 2012-07-23 14:57:38

+0

沒有線程,界面或多或少凍結長時間運行。儘管沒有計算的單元格(它是一個名稱和地址列表),我會嘗試禁用自動單元格計算。 – 2012-07-23 15:32:05

回答

4

您正在爲您正在閱讀和設置的每個單元進行多個COM調用。將整個範圍一次處理爲數組效率更高。

這個問題有選項進行了廣泛討論:Fastest way to interface between live (unsaved) Excel data and C# objects

隨着Excel-DNA和Excel C API,你可以讀取和寫入每秒百萬個細胞,但如果你閱讀和寫作,我通過COM甚至猜測作爲一個大陣,表現會相當不錯。

+0

謝謝,那正是我所需要的。 – 2012-07-23 17:37:27