recorrer insertar formato escribir ejemplos editar desde datos dar crear combinar celdas archivo c# excel com import

formato - insertar datos en excel desde c#



Necesita encontrar puntos de inicio y final de un rango de Excel en C# (4)

Intento leer un archivo Excel desde C # utilizando COM, y puedo abrirlo y cargarlo sin problemas. Sin embargo, no quiero usar todos los datos en la hoja (se expande mensualmente), solo un cierto subconjunto que comienza debajo de la parte superior de la hoja (fila 3 para encabezados, fila 4 para datos) y va al final . Actualmente puedo obtener un rango que representa todo el conjunto de datos como Excel.Worksheet.UsedRange , pero luego necesito manipularlo hasta el rango deseado, o (preferiblemente) encontrar el punto final para pasar a otro rango para mis datos reales recuperación. ¿Alguien puede decirme cómo hacer cualquiera de estos? Gracias.


Debería poder usar las propiedades Range.Row , Range.Rows.Count , Range.Column y Range.Columns.Count para obtener el inicio y el final de su rango de la siguiente manera:

Dim used As Range, first As Range, last As Range Set used = Sheet1.UsedRange Set first = Sheet1.Cells(used.Row, used.Column) Set last = Sheet1.Cells(used.Row + used.Rows.Count, used.Column + used.Columns.Count) MsgBox ("First: " + first.Address + " Last: " + last.Address)

Ese código de muestra está en VBA, pero todas esas funciones deberían estar disponibles en C # con COM.


Desde MSDN :

"Use la propiedad End, junto con un valor de la enumeración XlDirection (xlUp, xlToRight, xlToLeft, xlDown), para recuperar un rango que represente la celda al final de la región, como si hubiera presionado la tecla descrita por el valor enumerado;

rngDown = rng.get_End(Excel.XlDirection.xlDown);


No estoy seguro de lo que estás tratando de hacer. Pero aquí hay algunos ejemplos.

Supongo que tengo el siguiente rango:

Excel.Worksheet sheet = this.Application.ActiveSheet as Excel.Worksheet; Excel.Range range = sheet.get_Range("A1", "B5") as Excel.Range;

Para mover su rango hacia abajo por n -número de fila:

int n = 1; int rows = range.Rows.Count; int cols = range.Columns.Count; Excel.Range newRange = range.get_Offset(n, 0).get_Resize(rows-n,cols); newRange.Select(); //will select the new range will be 1 row lower

Para mover tu fila inferior hacia arriba

Excel.Range newRange = range.get_Resize(rows-n,cols); newRange.Select(); //will select the new range will be 1 row higher

Supongo que puedes descubrir cómo moverlo de un lado a otro.

get_Offset() moverá todo el rango y luego tendrá que cambiar el tamaño del rango.

EDITAR: Ahora que sé lo que quieres.

Para seleccionar la última celda:

Excel.Range lastCell = range.Cells[rows, cols] as Excel.Range; lastCell.Select();

Ahora puedes usar tu propio punto de partida de la siguiente manera:

Excel.Range newRange = sheet.get_Range("B1", lastCell); newRange.Select();


Ok, encontré una respuesta (después de casi 3 horas de búsqueda total, solicitada aquí 2 horas), así que publicaremos aquí para otros.

Excel.Range urange = (Excel.Range)xlWorkSheet.UsedRange; // gives us the actual range
string used = urange.get_Address(false, false, Excel.XlReferenceStyle.xlA1, Type.Missing, Type.Missing));

Desde MSDN:
public string get_Address (
[OptionalAttribute] Object RowAbsolute,
[OptionalAttribute] Object ColumnAbsolute,
[OptionalAttribute] XlReferenceStyle ReferenceStyle,
[OptionalAttribute] Object External,
[OptionalAttribute] Object RelativeTo
)

que aparentemente las dos primeras son banderas verdaderas / falsas, la siguiente se define como un objeto Microsoft.Office.Interop.Excel.XlReferenceStyle , y supongo que External es una referencia a un archivo externo, o una bandera de algún tipo . RelativeTo, solo puedo adivinar que se refiere a una posición arbitraria definida, tal vez un objeto rango, tal vez una cadena. Desafortunadamente, MSDN es extremadamente escaso en este tema, así que solo estoy adivinando aquí y publicando mis conjeturas. Sin embargo, al usar este código como lo publiqué, puedo recuperar el total usado como "A1: B245", que me da exactamente lo que quiero, y luego puedo crear un nuevo rango extrayendo la segunda parte y luego puedo continúa en.