Excel Interop только для чтения отфильтрованных строк - PullRequest
0 голосов
/ 01 февраля 2019

Оригинальный нефильтрованный стол

Original non filtered table

Фильтрованный стол

enter image description here

Я пытаюсь прочитать файл .xlsx, используя Interop.Excel.Переменная xlRange выглядит странно, когда я настраиваю ее на отображение только отфильтрованных ячеек (видимых):

Excel.Range xlRange = xlWorksheet.UsedRange.SpecialCells(Excel.XlCellType.xlCellTypeVisible, Type.Missing);

Отладка:

Когда таблица не фильтруется:

xlRange.Count: 15 // Общее количество элементов в таблице

rowCount: 5 // То есть, включая заголовок

Когда таблица фильтруется:

xlRange.Count: 9 // Это правильно

rowCount: 1 // Это должно быть 3 (включая заголовок)

        Excel.Application xlApp = new Excel.Application();
        Excel.Workbook xlWorkbook = xlApp.Workbooks.Open(Directory.GetCurrentDirectory() + "\\Example.xlsx");
        Excel._Worksheet xlWorksheet = xlWorkbook.Sheets[1];
        Excel.Range xlRange = xlWorksheet.UsedRange.SpecialCells(Excel.XlCellType.xlCellTypeVisible, Type.Missing);

        int rowCount = xlRange.Rows.Count;
        int colCount = xlRange.Columns.Count;

        //iterate over the rows and columns and print to the console as it appears in the file
        //excel is not zero based!!
        for (int i = 1; i <= rowCount; i++)
        {
            for (int j = 1; j <= colCount; j++)
            {
                //new line
                if (j == 1)
                    Console.Write("\r\n");

                //write the value to the console
                if (xlRange.Cells[i, j] != null && xlRange.Cells[i, j].Value2 != null)
                    Console.Write(xlRange.Cells[i, j].Value2.ToString() + "\t");
            }
        }

Учитывая, что xlRange.Count равен 9, я должениметь возможность доступа ко всем 3 строкам вручную, не обращая внимания на переменную rowCount, но xlRange кажется тем же исходным нефильтрованным диапазоном:

Console.WriteLine(xlRange.Cells[1, 1]);//Writes ID, Correct
Console.WriteLine(xlRange.Cells[2, 1]);//Writes 1, Should be 2
Console.WriteLine(xlRange.Cells[3, 1]);//Writes 2, Should be 4
Console.WriteLine(xlRange.Cells[4, 1]);//Writes 3, Should not be able to acces this element element at all because xlRange.Count is 9

1 Ответ

0 голосов
/ 01 февраля 2019

Я подозреваю, что вам нужно перебрать свойство .Rows вместо буквального обозначения строки / столбца.Примерно так:

foreach (Excel.Range row in xlRange.Rows)
{
    for (int j = 1; j <= colCount; j++)
    {
        //write the value to the console
        if (row.Cells[1, j] != null && row.Cells[1, j].Value2 != null)
            Console.Write(row.Cells[1, j].Value2.ToString() + "\t");
    }

    Console.WriteLine();
}

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

Дайте ему попытку идайте мне знать.

...