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?Obteniendo la última fila de Excel rellenada mediante programación utilizando C#
Respuesta
maneras 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;
Este es un problema común en Excel.
Aquí hay un código 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;
encontró here
o el uso de SpecialCells
Excel.Range last = sheet.Cells.SpecialCells(Excel.XlCellType.xlCellTypeLastCell, Type.Missing);
Excel.Range range = sheet.get_Range("A1", last);
[EDIT] hilos similares:
Esto está funcionando, he estado luchando para obtener la fila correcta. – NWessel
Para preguntas que implican el modelo de objetos de Excel, a menudo es más fácil de probarlo en VBA en primer lugar, a continuación, se traduce en C# es bastante trivial.
En este caso, una forma de hacerlo es en VBA:
Worksheet.UsedRange.Row + Worksheet.UsedRange.Rows.Count - 1
Pryank's answer es lo más cercano trabajó para mí. Añadí 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;
La única manera de que pudiera conseguir que funcione en todos los escenarios (excepto hojas protegidas):
Es compatible con:
Escaneo Ocultos de fila/columnas
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;
Brillante respuesta (y la única que funcionó para mí). –
El ActiveSheet.UsedRange.Value devuelve una matriz de objetos dimensional 2 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;
\t \t Excel.Range activeRange;
public virtual object[,] RangeArray {
\t \t \t get { return ActiveRange.Value; }
\t \t }
\t \t public virtual int ColumnCount {
\t \t \t get { return RangeArray.GetLength(1); }
\t \t }
\t \t public virtual int RowCount {
\t \t \t get { return RangeArray.GetLength(0); }
\t \t }
\t \t public virtual int LastRow {
\t \t \t get { return RowCount; }
\t \t }
Este problema es aún peor cuando hay posiblemente celdas 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 filas completamente vacías y devuelve el recuento de la columna más larga fila:
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;
}
Para aquellos que utilizan el método SpecialCells, (no estoy seguro acerca de otros), por favor en caso de que su última celda es fusionado, no podrá obtener la última fila y el número de columna utilizando Range.Row y Range.Column para obtener la última fila y columna como números. necesita primero Unmerge su rango y luego otra vez obtener 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 };
}
- 1. Obteniendo la última fila de una tabla usando jQuery?
- 2. Alterar mediante programación la altura de una fila de una hoja de Excel
- 3. Última celda no vacía en la fila; Excel VBA
- 4. la creación de grandes hojas de Excel mediante programación
- 5. Seleccionar mediante programación una fila en JTable
- 6. Generar informes mediante programación utilizando la API TFS y SSRS
- 7. ¿Cómo se selecciona mediante programación la fila superior de JQGrid?
- 8. mediante programación en C#
- 9. C# ¿Excel omitiendo la primera fila?
- 10. Eliminar última fila Databound DataGridView C#
- 11. Insertar comentarios de celda en Excel mediante programación
- 12. Agregar mediante programación una nueva fila a la subclase QAbstractListModel
- 13. crear un control mediante programación utilizando MFC
- 14. Instalar certificado SSL mediante programación utilizando Microsoft.Web.Administration
- 15. determinar mediante programación utilizando el camino de la gema bundler
- 16. Seleccione la fila tableview programación
- 17. Creación mediante programación de hojas de Excel 2007
- 18. AutoCompleteTextView recorta la última fila
- 19. DatagridView Seleccionar la última fila
- 20. Ocultar el libro de trabajo activo mediante programación en Excel
- 21. Copiar celdas en Excel utilizando C#
- 22. Cambie el tramo de fila/columna mediante programación (tablelayoutpanel)
- 23. Suma de la fila n hasta la última fila
- 24. ¿Cómo ejecutar mediante programación un conjunto de pruebas utilizando JUnit4?
- 25. Crear mediante programación el certificado X509 utilizando OpenSSL
- 26. ¿Cómo insertar mediante programación una fila en un GridView?
- 27. Cómo seleccionar mediante programación una fila en UITableView en MonoTouch?
- 28. Cómo crear un acceso directo mediante programación utilizando Win32
- 29. Cambio de colores mediante programación en C#
- 30. Creación de complemento para Excel utilizando C#
No estoy seguro de cómo funcionaría la primera opción ... Pero la segunda parece interesante. ¿Cómo puedo traducir eso en un valor int? – SoftwareSavant
He editado mi código, no he probado ese código pero espero que te dé una idea de lo que quieres lograr. – Priyank
Esta respuesta proporciona la última celda en UsedRange de la hoja de trabajo. El problema, sin embargo, es que UsedRange nunca se contrae. Si tiene un valor en A1 y AA100, entonces elimine el contenido de AA100, el UsedRange seguirá siendo A1: AA100. AA100 todavía se considerará la última celda. – CtrlDot