C # Excel Automation: получение строк после AutoFilter () с SpecialCells (), кажется, не работает должным образом - PullRequest
4 голосов
/ 12 октября 2011

Первый раз постер тут :). У меня возникла следующая проблема при автоматизации Excel 2010 из приложения WinForms C #. Моя тестовая таблица выглядит следующим образом:

Index    Value1  Value2
AAA        2       3   
AAA        3       4
AAA        3       8
BBB        2       2
BBB        5       6
BBB        3       5
CCC        1       2
CCC        2       2
DDD        2       5

Я успешно открыл книгу и загрузил лист из своего приложения на C #. После этого я запускаю следующий код:

        Excel.Range range = xlSheet.UsedRange;
        range.AutoFilter(1, "AAA", Excel.XlAutoFilterOperator.xlAnd, Type.Missing, true);
        Excel.Range filteredRange = range.SpecialCells(Excel.XlCellType.xlCellTypeVisible);

Это работает, как и ожидалось, и filterRange теперь содержит первые четыре строки моей тестовой таблицы (имена столбцов и все строки "AAA"). Однако, если я пытаюсь использовать Автофильтр, чтобы получить все строки "BBB", как это

        range.AutoFilter(1, "BBB", Excel.XlAutoFilterOperator.xlAnd, Type.Missing, true);
        Excel.Range filteredRange = range.SpecialCells(Excel.XlCellType.xlCellTypeVisible);

Я получаю только первую строку таблицы (имена столбцов) в диапазоне отфильтрованного диапазона. Если я действительно открою таблицу в Excel, то увижу, что она правильно отфильтрована (строки «BBB») отфильтрованы, но каким-то образом метод Range.SpecialCells () не работает должным образом и возвращает только первую строку. Я перепробовал все, что мог придумать, но, поскольку я новичок в автоматизации Excel, возможно, я что-то упустил, поэтому я подумал, что вы, ребята, могли бы помочь. Единственное, что мне приходит в голову, это то, что в первом случае («AAA») все видимые строки являются последовательными - имена столбцов находятся в строке 1, а строки «AAA» - 2, 3 и 4 соответственно. Во втором случае имена находятся в строке 1, но строки «BBB» имеют индексы 5, 6 и 7, то есть в таблице есть «дыра». Может ли это повлиять на метод SpecialCells ()?

Заранее благодарим за любой вклад, который вы можете иметь!

Ответы [ 3 ]

8 голосов
/ 13 октября 2011

Хорошо, я решил свою собственную проблему, но я хотел бы поделиться решением, потому что какая-то другая бедная душа может однажды бороться с той же проблемой.По сути, моя первая идея, что проблема может заключаться в непоследовательности строк, привела меня к правильному ответу.Пока все отфильтрованные значения находятся прямо под первой строкой таблицы, метод SpecialCells () возвращает одну отдельную область, и поэтому FilterRange показывает в своем элементе Value2 все требуемые значения (в приведенном выше тестовом примере все"ААА") строк.Однако, если отфильтрованные строки находятся ниже в таблице, как в случае с «BBB», метод SpecialCells () возвращает несколько областей, в этом случае две первые области, содержащие только строку имен столбцов, а вторую область.содержащий три строки "BBB".Решение состоит в том, чтобы перебрать все области в FilterRange и извлечь / манипулировать значениями оттуда:

        for (int areaId = 1; areaId <= filteredRange.Areas.Count; areaId++)
        {
            Excel.Range areaRange = filteredRange.Areas.get_Item(areaId);
            object[,] areaValues = areaRange.Value2;
            // Do something with the values here...

Вот и все.Я надеюсь, что это когда-нибудь поможет кому-то еще ...

1 голос
/ 21 ноября 2018

Я использовал этот метод ниже, чтобы получить данные внутри диапазона,

foreach (Excel.Range area in visibleCells.Areas)

  {
     foreach (Excel.Range row in area.Rows)
     {
         int index = row.Row; // now index is the present Row index within the range.you
         string test = Mysheet.Cells[index,4].Values // Mysheet is my present working sheet. After this test will contain the values pointing to the values.cells[index,4].
     }
}
1 голос
/ 08 февраля 2016

Попробуйте следующее:

var rowcount = filteredRange.Count / filteredRange.Columns.Count;
...