Excel Get_Range с несколькими областями

Я пытаюсь получить диапазон из Excel, в котором указано несколько областей, по сути, у меня есть...

int StartColumn
int EndColumn
int[] ColumnsToSkip

Когда вы комбинируете их, можно создать диапазон с несмежными областями. К сожалению, я не могу понять, как это сделать... MSDN не очень полезен...

Рабочий лист;

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

Кто-нибудь оказывает любую помощь? Ваше здоровье.


person Ian    schedule 27.05.2011    source источник


Ответы (3)


Очень простое решение — указать разные области через запятую:

sheet.get_Range( "A1:B1,E1:G1");

Для программных комбинаций диапазонов существуют также методы Union и Intersection объекта ExcelApplication. Их немного неуклюже использовать в 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);
    }
person Doc Brown    schedule 27.05.2011
comment
Это немного более неудобно, так как я имею дело с индексами, но если это единственный способ.. - person Ian; 30.05.2011
comment
@Ian: см. мой подробный ответ выше. - person Doc Brown; 30.05.2011
comment
Еще не пробовал, но похоже, что это сработает. Как раз собирался дать ему вихрь. Должен полюбиться интеллектуальный смысл этого метода app.Union, приятно наконец иметь необязательные параметры в C#! - person Ian; 31.05.2011
comment
вторым параметром Enumerable.Range является количество: int[] ColumnsToKeep = Enumerable.Range(StartColumn, EndColumn - StartColumn + 1).Except(ColumnsToSkip).ToArray(); - person Slai; 27.10.2015

Попробуй это:

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);
person Sariato    schedule 07.10.2020
comment
Поздравляю с первым постом! - person Alex S; 07.10.2020

Другой способ работы с несмежными диапазонами — просто объединить их вместе в Excel, используя именованный диапазон, например:

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

Это создаст массив, состоящий из диапазонов, «наложенных» друг на друга. Назначьте эту формулу именованному диапазону, и вы сможете использовать ее программно, как и любой другой объект Range.

person Rick supports Monica    schedule 12.08.2014