Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Excel获取多个区域的范围_C#_Excel_Excel Interop - Fatal编程技术网

C# Excel获取多个区域的范围

C# Excel获取多个区域的范围,c#,excel,excel-interop,C#,Excel,Excel Interop,我正试图从Excel中获取一个范围,它指定了多个区域,基本上我有 int StartColumn int-EndColumn int[]ColumnsToSkip 当你把这些结合起来的时候,就有可能产生一个区域是不连续的。不幸的是,我不太明白要得到这个。。。MSDN不是很有用 工作表 sheet.get_Range( what goes in here??? ); 有人提供帮助吗?干杯。一个非常简单的解决方案是以逗号分隔的形式指定不同的区域: sheet.get_Range( "A1:B1,E

我正试图从Excel中获取一个范围,它指定了多个区域,基本上我有

int StartColumn
int-EndColumn
int[]ColumnsToSkip

当你把这些结合起来的时候,就有可能产生一个区域是不连续的。不幸的是,我不太明白要得到这个。。。MSDN不是很有用

工作表

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

有人提供帮助吗?干杯。

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

sheet.get_Range( "A1:B1,E1:G1");
对于编程范围组合,还有ExcelApplication对象的
联合
交叉
方法。在C#中使用这些参数有点笨拙,因为有许多可选参数。看这里

例如

编辑:一些附加提示:

在您的例子中,您首先应该转换“ColumnStokep”中的“ColumnsToSkip”,因为这是任何类型的单元合并所需要的。以下是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);
    }

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

=选择({1;2;3},范围1,范围2,范围3)

这将生成一个由“堆叠”在一起的范围组成的数组。将此公式指定给命名范围,您可以像使用任何其他
范围
对象一样以编程方式使用它

试试这个:

使用Excel=Microsoft.Office.Interop.Excel;
  • 将您的范围收集到一个数组中:
  • Excel.Range[]ranges=new Excel.Range[]{yourRange1,yourRange2,…};
    
  • 使用范围地址创建字符串范围并从中获取多个范围:
  • string multiRangeStr=”“;
    foreach(范围中的Excel.Range)
    {
    string address=range.address[true,true,Excel.XlReferenceStyle.xlA1];
    multiRangeStr+=(multiRangeStr==“”?“”:“;”)+地址;
    }
    //输出:多量程STR:“A1:A3;B1:B3”
    Excel.Range multiRange=wsheet.Range(multiRangeStr);
    
    这有点尴尬,因为我正在处理标识,但如果这是唯一的方法。@Ian:请看我上面详细的回答。还没有尝试过,但看起来这样就可以了。我正要试一下。我一定很喜欢这个应用程序的智能感知。Union方法,很高兴终于在C#中有了可选的参数!Enumerable.Range的第二个参数是count:int[]ColumnsToKeep=Enumerable.Range(StartColumn,EndColumn-StartColumn+1)。除了(ColumnsToSkip).ToArray();恭喜你的第一杆!