【问题标题】:Excel Get_Range with multiple areas具有多个区域的 Excel Get_Range
【发布时间】:2023-03-29 11:04:01
【问题描述】:

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

int StartColumn
int EndColumn
int[] ColumnsToSkip

当您将这些组合在一起时,可能会产生一个包含不连续区域的范围。不幸的是,我不太清楚得到这个的电话...... MSDN 不是很有用......

工作表;

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

有人提供帮助吗?干杯。

【问题讨论】:

    标签: c# excel excel-interop


    【解决方案1】:

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

    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);
        }
    

    【讨论】:

    • 这有点尴尬,因为我正在处理索引,但如果这是唯一的方法..
    • @Ian:请参阅上面的详细回答。
    • 尚未尝试过,但看起来可以完成这项工作。正要试一试。必须喜欢该 app.Union 方法的智能感知,很高兴终于在 C# 中有可选参数!
    • Enumerable.Range 的第二个参数是 count : int[] ColumnsToKeep = Enumerable.Range(StartColumn, EndColumn - StartColumn + 1).Except(ColumnsToSkip).ToArray();
    【解决方案2】:

    试试这个:

    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);
    

    【讨论】:

    • 恭喜你的第一个帖子!
    【解决方案3】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-02-11
      • 1970-01-01
      • 2020-03-11
      • 2021-01-15
      • 2015-12-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多