2011-05-27 97 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对象一样以编程方式使用它。