Excel获取具有多个区域的范围

11

我想从Excel中获取指定多个区域的范围,基本上我有:

int StartColumn
int EndColumn
int[] ColumnsToSkip

当它们结合在一起时,可以生成具有非连续区域的范围。不幸的是,我无法弄清如何调用此功能...MSDN并没有什么用...

工作表 sheet;

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

有人能提供帮助吗?谢谢。

3个回答

11

一个非常简单的解决方案是以逗号分隔的形式指定不同的区域:

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]);
   }
例如,"Union" 可以定义为如下形式:
    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);
    }

这有点棘手,因为我正在处理索引,但如果这是唯一的方法... - Ian
@Ian:请看我上面详细阐述的答案。 - Doc Brown
还没有尝试过,但看起来应该能胜任。我马上就要试一下了。这个应用程序的智能感知真是太棒了。Union方法,在C#中终于有可选参数了,真不错! - Ian
Enumerable.Range的第二个参数是计数:int [] ColumnsToKeep = Enumerable.Range(StartColumn,EndColumn-StartColumn + 1).Except(ColumnsToSkip).ToArray(); - Slai

1

试试这个:

using Excel = Microsoft.Office.Interop.Excel;

将你的范围收集到一个数组中:
Excel.Range[] ranges = new Excel.Range[] {yourRange1, yourRange2, ... };
  1. 创建包含范围地址的字符串范围,并从中获取多个范围:
string multiRangeStr = "";
foreach (Excel.Range range in ranges)
{
    string address = range.Address[true, true, Excel.XlReferenceStyle.xlA1];
    multiRangeStr += (multiRangeStr == "" ? "" : ";") + address;
}
//output: multiRangeStr: "A1:A3;B1:B3"

Excel.Range multiRange = wsheet.Range(multiRangeStr);

恭喜你的第一篇帖子! - Alex S

0

处理非连续区域的另一种方法是在Excel中使用命名区域将它们组合在一起,例如:

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

这将生成一个由“堆叠”在一起的区域组成的数组。将此公式分配给命名区域,您可以像任何其他Range对象一样在程序中使用它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接