Как получить правильный диапазон строк после фильтрации результатов в Excel Interop - PullRequest
0 голосов
/ 12 декабря 2011

Это расширение Как получить доступ к ячейке в Excel Interop при использовании отфильтрованных диапазонов?

Почему первый сегмент кода проходит через правильное количество строк, а второй сегмент выходит за пределы диапазона строк? Напомним:

   range = ws.UsedRange;
   for (int row = 3; row <= range.Rows.Count; row++)
    {
        Object nObj = ((Excel.Range)ws.Cells[row, "N"]).Text;
    }

Перебирает правильное количество строк, но не учитывает отфильтрованные строки.

   range = ws.UsedRange.SpecialCells(Excel.XlCellType.xlCellTypeVisible, Type.Missing);
    foreach (Excel.Range area in range.Areas)
    {
        foreach (Excel.Range row in area.Rows)
            //for (int row = 3; row <= range.Rows.Count; row++)
            {
                Object nObj = ((Excel.Range)row.Cells[1, 14]).Text;
            }
    }

Принимает во внимание отфильтрованные строки, но внутренний цикл продолжается за пределами ярости строк на область.

1 Ответ

1 голос
/ 12 декабря 2011

Внешний цикл по областям кажется избыточным. Вы можете попробовать удалить его и изменить внутренний цикл на

foreach (Excel.Range row in range.Rows)

Кроме того, Range.UsedRange, как известно, иногда возвращает неожиданные результаты. Смотри http://www.vbaexpress.com/kb/getarticle.php?kb_id=82

Есть несколько альтернатив: -

  1. range = ((Excel.Range)ws.Cells[1, 1]).CurrentRegion - если в вашем диапазоне есть хотя бы один столбец с непрерывными значениями (без пропусков), это должно работать хорошо.

  2. Назовите диапазон явно, чтобы вы могли просто сделать range = ws.Range("MyRange")

  3. Найдите последнюю строку вашего диапазона и создайте целевой диапазон, используя первую строку и последнюю строку, например, range = ws.Range(ws.Cells[1, 1], ((Excel.Range)ws.Cells[1048576,1]).End(xlUp)).EntireRow (обратите внимание, что 1048576 - это самый высокий индекс строки в Excel 2007 и Excel 2010, а 65536 - это самый высокий индекс строки в более ранних версиях). Здесь я использую первый столбец диапазона, чтобы определить последнюю строку диапазона, вызывая End(xlUp) в ячейке внизу листа в этом первом столбце. Для этого необходимо, чтобы столбец не содержал пустых значений в данных. Если первый столбец может содержать пустые значения, вам следует использовать другой столбец, который гарантированно будет иметь значение в ваших данных.

Кроме того, чтобы сохранить пропуск первых двух строк, вы можете попробовать: -

using System.Linq;

foreach (Excel.Range row in range.Rows.Skip(2))

(Очевидно, что если вы использовали альтернативный метод 3 для определения целевого диапазона, то вы могли бы установить первую строку равной строке 3 вместо строки 1, используя ws.Cells[3, 1] в качестве верхней границы диапазона, поэтому вам не придется звоните Skip() таким образом).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...