Подтвердить что ты не робот

Программно получая последнюю заполненную строку excel, используя С#

Я пытаюсь получить последнюю строку листа excel с помощью библиотеки Microsoft.interop.Excel и С#. Я хочу это сделать, потому что мне поручено перебирать все записи таблицы Excel и выполнять какую-то операцию над ними. В частности, мне нужно фактическое число последней строки, так как я буду использовать это число в функции. Кто-нибудь знает, как это сделать?

4b9b3361

Ответ 1

Пара способов,

using Excel = Microsoft.Office.Interop.Excel;

Excel.ApplicationClass excel = new Excel.ApplicationClass();
Excel.Application app = excel.Application;
Excel.Range all = app.get_Range("A1:H10", Type.Missing);

ИЛИ

Excel.Range last = sheet.Cells.SpecialCells(Excel.XlCellType.xlCellTypeLastCell, Type.Missing);
Excel.Range range = sheet.get_Range("A1", last);

int lastUsedRow = last.Row;
int lastUsedColumn = last.Column;

Ответ 2

Это обычная проблема в Excel.

Вот код С#:

// Find the last real row
nInLastRow = oSheet.Cells.Find("*",System.Reflection.Missing.Value, 
System.Reflection.Missing.Value, System.Reflection.Missing.Value,    Excel.XlSearchOrder.xlByRows,Excel.XlSearchDirection.xlPrevious, false,System.Reflection.Missing.Value,System.Reflection.Missing.Value).Row;

// Find the last real column
nInLastCol = oSheet.Cells.Find("*", System.Reflection.Missing.Value,     System.Reflection.Missing.Value,System.Reflection.Missing.Value, Excel.XlSearchOrder.xlByColumns,Excel.XlSearchDirection.xlPrevious,    false,System.Reflection.Missing.Value,System.Reflection.Missing.Value).Column;

найдено здесь

или используя SpecialCells

Excel.Range last = sheet.Cells.SpecialCells(Excel.XlCellType.xlCellTypeLastCell, Type.Missing);
Excel.Range range = sheet.get_Range("A1", last);

[EDIT] Похожие темы:

Ответ 3

Ответ Pryank - это то, что работало ближе всего для меня. Я добавил немного ближе к концу (.Row), поэтому я не просто возвращаю range, но integer.

int lastRow = wkSheet.Cells.SpecialCells(XlCellType.xlCellTypeLastCell, Type.Missing).Row;

Ответ 4

Для вопросов, связанных с объектной моделью Excel, часто проще сначала попробовать его в VBA, а затем перевести на С# довольно тривиально.

В этом случае один способ сделать это в VBA:

Worksheet.UsedRange.Row + Worksheet.UsedRange.Rows.Count - 1

Ответ 5

Единственный способ заставить его работать во всех сценариях (кроме защищенных листов):

Он поддерживает:

  • Сканирование скрытой строки/столбцов

  • Игнорирует отформатированные ячейки без данных/формулы

код:

// Unhide All Cells and clear formats
sheet.Columns.ClearFormats();
sheet.Rows.ClearFormats();

// Detect Last used Row - Ignore cells that contains formulas that result in blank values
int lastRowIgnoreFormulas = sheet.Cells.Find(
                "*",
                System.Reflection.Missing.Value,
                InteropExcel.XlFindLookIn.xlValues,
                InteropExcel.XlLookAt.xlWhole,
                InteropExcel.XlSearchOrder.xlByRows,
                InteropExcel.XlSearchDirection.xlPrevious,
                false,
                System.Reflection.Missing.Value,
                System.Reflection.Missing.Value).Row;
// Detect Last Used Column  - Ignore cells that contains formulas that result in blank values
int lastColIgnoreFormulas = sheet.Cells.Find(
                "*",
                System.Reflection.Missing.Value,
                System.Reflection.Missing.Value,
                System.Reflection.Missing.Value,
                InteropExcel.XlSearchOrder.xlByColumns,
                InteropExcel.XlSearchDirection.xlPrevious,
                false,
                System.Reflection.Missing.Value,
                System.Reflection.Missing.Value).Column;

// Detect Last used Row / Column - Including cells that contains formulas that result in blank values
int lastColIncludeFormulas = sheet.UsedRange.Columns.Count;
int lastColIncludeFormulas = sheet.UsedRange.Rows.Count;

Ответ 6

ActiveSheet.UsedRange.Value возвращает массив 2-мерных объектов из [row, column]. Проверка длины обоих измерений даст индекс LastRow и индекс LastColumn. В приведенном ниже примере используется С#.

       Excel.Worksheet activeSheet;
		Excel.Range activeRange;


        public virtual object[,] RangeArray {
			get { return ActiveRange.Value; }
		}

		public virtual int ColumnCount {
			get { return RangeArray.GetLength(1); }
		}


		public virtual int RowCount {
			get { return RangeArray.GetLength(0); }
		}

		public virtual int LastRow {
			get { return RowCount; }
		}

Ответ 7

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

Мое решение игнорирует полностью пустые строки и возвращает наибольшее количество строк столбца:

private static int GetLastRow(Worksheet worksheet)
    {
        int lastUsedRow = 1;
        Range range = worksheet.UsedRange;
        for (int i = 1; i < range.Columns.Count; i++)
        {
            int lastRow = range.Rows.Count;
            for (int j = range.Rows.Count; j > 0; j--)
            {
                if (lastUsedRow < lastRow)
                {
                    lastRow = j;
                    if (!String.IsNullOrWhiteSpace(Convert.ToString((worksheet.Cells[j, i] as Range).Value)))
                    {
                        if (lastUsedRow < lastRow)
                            lastUsedRow = lastRow;
                        if (lastUsedRow == range.Rows.Count)
                            return lastUsedRow - 1;
                        break;
                    }
                }
                else
                    break;
            }
        }
        return lastUsedRow;
    }

Ответ 8

Для тех, кто использует метод SpecialCells (я не уверен в других), обратите внимание, что если ваша последняя ячейка объединена, вы не сможете получить номер последней строки и столбца используя Range.Row и Range.Column, чтобы получить последние строки и столбцы в виде чисел. вам нужно сначала Unmerge ваш диапазон, а затем снова получить последнюю ячейку. Мне это очень дорого.

private int[] GetLastRowCol(Ex.Worksheet ws)
    {
        Ex.Range last = ws.Cells.SpecialCells(Ex.XlCellType.xlCellTypeLastCell, Type.Missing);
        bool isMerged = (bool)last.MergeCells;
        if (isMerged)
        {
            last.UnMerge();
            last = ws.Cells.SpecialCells(Ex.XlCellType.xlCellTypeLastCell, Type.Missing);
        }
        return new int[2] { last.Row, last.Column };
    }

Ответ 9

Как обсуждалось ранее, методы выше (xlCellTypeLastCell и т.д.) Не всегда обеспечивают ожидаемые результаты. Хотя нетрудно выполнить итерацию вниз по столбцу, проверяя значения, иногда вы можете обнаружить, что есть пустые ячейки или строки с данными, которые вы хотите рассмотреть в последующих строках. При непосредственном использовании Excel хороший способ найти последнюю строку - это нажать пару раз клавишу CTRL + стрелка вниз (в итоге вы получите строку 1048576 для листа XLSX), а затем нажать клавишу CTRL + стрелка вверх, которая выберет последнюю населенный пункт. Если вы сделаете это в Excel во время записи макроса, вы получите код для его репликации, а затем просто пример его настройки для С# с использованием библиотек Microsoft.Office.Interop.Excel. Например:

    private int GetLastRow()
    {
        Excel.Application ExcelApp;
        ExcelApp = new Excel.Application();

        ExcelApp.Selection.End(Excel.XlDirection.xlDown).Select();
        ExcelApp.Selection.End(Excel.XlDirection.xlDown).Select();
        ExcelApp.Selection.End(Excel.XlDirection.xlDown).Select();

        ExcelApp.Selection.End(Excel.XlDirection.xlUp).Select();

        return ExcelApp.ActiveCell.Row;
    }

Возможно, это не самое элегантное решение (я полагаю, вместо этого вы могли бы перейти к последней строке таблицы непосредственно перед использованием XlUp), но оно кажется более надежным.