última vacias vacia ultima seleccionar pegar para obtener macro llega insertar hasta fila datos cómo con celdas celda buscar c# excel

vacias - Obtenga programáticamente la última fila de Excel llena usando C#



seleccionar hasta la ultima celda con datos vba (8)

Maneras de pareja,

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);

O

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;

Estoy tratando de obtener la última fila de una hoja de Excel programáticamente utilizando Microsoft.interop.Excel Library y C #. Quiero hacer eso, porque estoy a cargo de recorrer todos los registros de una hoja de cálculo Excel y realizar algún tipo de operación sobre ellos. Específicamente, necesito el número real de la última fila, ya que incluiré este número en una función. ¿Alguien tiene alguna idea de cómo hacer eso?


Para las preguntas que involucran el modelo de objetos de Excel, a menudo es más fácil probarlo primero en VBA, luego traducirlo a C # es bastante trivial.

En este caso, una forma de hacerlo en VBA es:

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


La única forma en que podría hacerlo funcionar en TODOS los escenarios (excepto las hojas protegidas):

Es compatible con:

  • Escaneo de filas / columnas ocultas

  • Ignora celdas formateadas sin datos / fórmula

Código:

// 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;


ActiveSheet.UsedRange.Value devuelve una matriz de objeto bidimensional de [fila, columna]. Verificar la longitud de ambas dimensiones proporcionará el índice LastRow y el índice LastColumn. El siguiente ejemplo usa C #.

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; } }


Este problema es aún peor cuando hay celdas posiblemente vacías. Pero debe leer una fila incluso si solo se llena un valor. Puede tomar un tiempo cuando hay muchas celdas sin llenar, pero si la entrada está cerca de ser correcta, es bastante rápido.

Mi solución ignora las filas completamente vacías y devuelve el recuento de filas de la columna más larga:

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; }


Este es un problema común en Excel.

Aquí hay un código de C #:

// 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;

encontrado aquí

o usando SpecialCells

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

[EDITAR] Hilos similares:


La respuesta de Pryank es lo que más me funcionó. .Row un poco hacia el final ( .Row ), así que no solo estoy devolviendo un range , sino un integer .

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


Para aquellos que usan el método SpecialCells, (no estoy seguro de los demás), tenga en cuenta que en caso de que se fusione su última celda, no podrá obtener el último número de fila y columna usando Range.Row y Range.Column para obtener la última fila y columna como números. Primero debes desunir tu rango y luego obtener nuevamente la última celda. Me costó mucho.

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 }; }