2011-05-27 94 views
7

我試圖讓從Excel,其中指定了多個領域的廣泛,基本上我有...的Excel Get_Range多個領域

INT STARTCOLUMN
INT ENDCOLUMN
INT [] ColumnsToSkip

當你結合這些可以產生一個非連續區域的範圍。不幸的是,我不能完全弄清楚這個電話... MSDN不是很有用...

WorkSheet sheet;

sheet.get_Range(what goes in here???); 

有人提供任何幫助?乾杯。

回答

8

一個非常簡單的解決方案是在以逗號分隔的形式來指定不同的區域:

sheet.get_Range("A1:B1,E1:G1"); 

對於編程範圍的組合,也有在ExcelApplication對象的UnionIntersection方法。由於許多可選參數,這些在C#中使用有點笨拙。看到這裏

http://codeidol.com/csharp/c-sharp-in-office/Working-with-Excel-Objects/Working-with-the-Range-Object/

的例子。

編輯:一些額外提示:

在你的情況,你首先要轉變「ColumnsToSkip」在「ColumnsToKeep」,因爲這是你所需要的任何一種細胞工會。這裏是一個LINQ的解決方案:

int[] ColumnsToKeep = Enumerable.Range(StartColumn, EndColumn -StartColumn + 1) 
         .Except(ColumnsToSkip) 
         .ToArray(); 

然後,您可以沿着這個例子的線條創造的東西:

Excel.Range totalRange = null; 
    foreach(int col in ColumnsToKeep) 
    { 
     totalRange = Union(excelApp,totalRange,(Excel.Range)sh.Cells[row, col]); 
    } 

其中 「聯盟」 的定義,例如,像這樣:

static Excel.Range Union(Excel.Application app, Excel.Range r1, Excel.Range r2) 
    { 
     if (r1 == null && r2 == null) 
      return null; 
     if (r1 == null) 
      return r2; 
     if (r2 == null) 
      return r1; 
     return app.Union(r1, r2, 
      null, null, null, null, null, null, 
      null, null, null, null, null, null, 
      null, null, null, null, null, null, 
      null, null, null, null, null, null, 
      null, null, null, null); 
    } 
+0

這有點尷尬,因爲我處理的痕跡,但如果這是唯一的方法...... – Ian 2011-05-30 07:54:05

+0

@Ian:看到我上面詳細闡述的答案。 – 2011-05-30 12:22:51

+0

尚未嘗試,但看起來會做這項工作。只是想給它一個旋風。總是喜歡那個應用程序的智能感.Union方法,很好,最後在C#中有可選參數! – Ian 2011-05-31 08:16:43

0

另一種使用非連續範圍的方法是在Excel中使用命名範圍將它們組合在一起,例如:

=CHOOSE({1;2;3},RANGE1,RANGE2,RANGE3)

這將產生一個由「堆疊」在彼此頂部的範圍組成的數組。將此公式分配給命名範圍,並且可以像編寫任何其他Range對象一樣以編程方式使用它。