Excel: возвращение выбранных строк

Я использую Microsoft. Office. Interop. Excel, и я не могу найти способ возвратить выбранные строки. То, под чем я подразумеваю "выбранный", сами номера строк, когда Вы нажимаете на поле строки слева и выбираете одну или несколько непрерывных или строк, состоящих из нескольких несмежных участков (который выделяет целую строку.) Это отличается от выбора региона или области на самом листе.

До сих пор я посмотрел на приложение. Выбор, приложение. Ячейки, приложение. Строки, и ни один из них, кажется, не дает мне строки. приложение. Выбор дает мне фактическое содержание ячейки, которое НЕ является тем, что я хочу.

Какие-либо идеи?Спасибо!

5
задан APC 21 January 2010 в 15:26
поделиться

1 ответ

Для этого необходимо перечислить каждую область в диапазоне, а затем перечислять строки в каждой области. Несколько смущает, свойство Excel.range.rows возвращает коллекцию диапазонов (каждый представляющий строку), а свойство Excel.range.row возвращает номер строки левая клетка в диапазоне.

Следовательно, чтобы получить номера строк, вы должны перечислить области и коллекции строк, а затем получить доступ к дальности. Например:

Excel.Range range = (Excel.Range)excelApp.Selection;

List<int> rowNumbers = new List<int>();

// Enumerate the Rows within each Area of the Range.
foreach (Excel.Range area in range.Areas)
{
    foreach (Excel.Range row in area.Rows)
    {
        rowNumbers.Add(row.Row);
    }
}

// Report the results.
foreach (int rowNumber in rowNumbers)
{
    MessageBox.Show(rowNumber.ToString());
}

Вы можете даже использовать LINQ, если хотите.

Использование синтаксиса запросов:

IEnumerable<int> rowNumbers =
    from area in range.Areas.Cast<Excel.Range>()
    from row in area.Rows.Cast<Excel.Range>()
    select row.Row;

Использование синтаксиса метода:

IEnumerable<int> rowNumbers =
    range.Areas.Cast<Excel.Range>()
    .SelectMany(area => area.Rows.Cast<Excel.Range>()
                        .Select(row => row.Row));

Обновление: Как вернуться Отчетливые номера рядные номера:

для возврата различных номеров строк (которые могут возникнуть при многоместном диапазоне выбран, где область не содержат целых строк).

(1) Самый простой является использование LINQ и использовать различные Оператор . Например:

Использование синтаксиса запроса:

IEnumerable<int> distinctRowNumbers =
    (from area in range.Areas.Cast<Excel.Range>()
     from row in area.Rows.Cast<Excel.Range>()
     select row.Row)
    .Distinct();

с использованием синтаксиса метода:

IEnumerable<int> distinctRowNumbers =
    range.Areas.Cast<Excel.Range>()
    .SelectMany(area => area.Rows.Cast<Excel.Range>()
                        .Select(row => row.Row))
    .Distinct();

(2) Если не использовать LINQ, то вы можете использовать HashSet . Например:

Excel.Range range = (Excel.Range)excelApp.Selection;

HashSet<int> distinctRowNumbers = new HashSet<int>();

// Enumerate the Rows within each Area of the Range.
foreach (Excel.Range area in range.Areas)
{
    foreach (Excel.Range row in area.Rows)
    {
        distinctRowNumbers.Add(row.Row);
    }
}

// Report the results.
foreach (int rowNumber in distinctRowNumbers)
{
    MessageBox.Show(rowNumber.ToString());
}

(3) Возможно, наиболее интуитивно понятный подход - сначала преобразовать ваш исходный диапазон на целые ряды, а затем повторять строки. В этом случае строки уже гарантированы уникальными, поэтому нам не нужно использовать HASHSET или Оператор .

В этих примерах обратите внимание на использование Excel.range.entirerow , который применяется к исходному диапазону перед перечислением областей и строк:

Перечисление без использования LINQ:

List<int> distinctRowNumbers = new List<int>();

foreach (Excel.Range area in range.EntireRow.Areas)
{
    foreach (Excel.Range row in area.Rows)
    {
        distinctRowNumbers.Add(row.Row);
    }
}

LINQ с помощью запроса Синтаксис:

IEnumerable<int> distinctRowNumbers =
    from area in range.EntireRow.Areas.Cast<Excel.Range>()
    from row in area.Rows.Cast<Excel.Range>()
    select row.Row;

LINQ с использованием синтаксиса метода:

IEnumerable<int> distinctRowNumbers =
    range.EntireRow.Areas.Cast<Excel.Range>()
    .SelectMany(area => area.Rows.Cast<Excel.Range>()
                        .Select(row => row.Row));

Обратите внимание, что диапазон может вернуть неверный результат , но, если я понимаю это правильно, это только относится к Excel '95 и ниже, что полностью устарел. (Я бы не беспокоился о какой-либо версии Excel ниже Excel '97.) Если вы беспокоитесь о любых вопросах версий, однако, и не имеете роскоши тестирования во всех версиях Excel, тогда вы можете придерживаться использования HashSet или используйте LINQ вместе с отдельным оператором, чтобы убедиться, что ваши строки уникальны.

Надеюсь, это поможет!

Майк

10
ответ дан 13 December 2019 в 22:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: