Reafidy's edited answer is a great start,但是我想在評論中做更多的擴展。 sheet.get_Range(rangeselect)
比逐行更快,但是我還沒有提到的一件事是get_Range參數有255個字符的限制。
要解決這個問題的限制,構建一組範圍的,如「8:8,10:13,14:55」爲正常,然後使用此代碼的變體:
string rangeSelectPart;
while (rangeSelect.Length >= 255)
{
rangeSelectPart = rangeSelect.Substring(0, rangeSelect.Substring(0,255).LastIndexOf(','));
Range multiRangePart = sheet.get_Range(rangeSelectPart, Type.Missing);
//do something with the range here using multiRangePart
rangeSelect= rangeSelect.Substring(rangeSelectPart.Length + 1);
}
Range multiRange = sheet.get_Range(rangeSelect, Type.Missing);
// do the same something with the last part of the range using multiRange
// now that the remaining rows are described in less than 255 characters
這將比在單個行上執行操作快得多,但是當呈現大的非連續行集時也不會失敗。
請注意,SutharMonil's answer is way faster IFF設置值在連續的矩形範圍內。從C#到Excel的瓶頸通常是通過COM對象的重複調用,這些對象在創建和更新時會被阻塞,並且他的回答很好地整合了調用。
不幸的是,在我到目前爲止的測試中,試圖使用它來處理非字符串屬性而不是字符串類型,這導致了一個類型錯誤。例如:
object[,] colors;
//use C# to set appropriate colors to each location in array...
for(int i = 0; i < colors.get_Length(0); i++){
for(int j = 0; j < colors.get_Length(1); j++){
colors[i,j] = XlThemeColor.xlThemeColorAccent6;
}
}
//below causes a type error
formatRange.Interior.ThemeColor = color;
我會盡量記住更新,如果我得到它的工作。
最後對於重複操作設置Globals.ThisAddIn.Application.ScreenUpdating = false;
,然後在完成後將其設置爲true。如果沒有這些,Excel將停止更新每個範圍屬性集更新後的屏幕,並且可能會爲操作增加大量時間。
您可以合併各個範圍,但這可能不會比使用具有連接地址的單一調用更有效。 –