10

我正在尝试从 Excel 中获取一个范围,该范围指定了多个区域,基本上我有......

int StartColumn
int EndColumn
int[] ColumnsToSkip

当您将这些结合起来时,可能会产生具有非连续区域的范围。不幸的是,我无法弄清楚得到这个的电话...... MSDN不是很有用......

工作表;

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

有人提供任何帮助吗?干杯。

4

3 回答 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/

举些例子。

编辑:一些额外的提示:

在您的情况下,您首先应该在“ColumnsToKeep”中转换“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]);
   }

例如,其中定义了“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);
    }
于 2011-05-27T16:42:07.253 回答
1

尝试这个:

using Excel = Microsoft.Office.Interop.Excel;
  1. 将您的范围收集到一个数组中:
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);
于 2020-10-07T13:59:26.553 回答
0

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

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

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

于 2014-08-12T16:02:30.830 回答