2011-07-01 18 views
20

estoy usando C# para manipular una hoja de cálculo de Excel. Los siguientes dos piezas de código debería funcionar de la misma, pero uno que funciona y la otra emite una excepción. Me pregunto porque.Hoja de trabajo get_Range lanza excepción

Esto funciona:

oRange = (Excel.Range)oSheet.get_Range("A1","F1"); 
oRange.EntireColumn.AutoFit(); 

Esto arroja una excepción:

oRange = (Excel.Range)oSheet.get_Range(oSheet.Cells[1, 1],oSheet.Cells[4,4]); 
oRange.EntireColumn.AutoFit(); 

Excepción:

RuntimeBinderException occurred. "object" does not contain a definition for 'get_Range' 

El oSheet se crea una instancia de la siguiente manera:

Excel.Worksheet oSheet = new Excel.Worksheet(); 

¿Se supone que debo instanciar ambos de manera diferente?

+0

Parece que, "oSheet" se escribe una vez como Hoja de trabajo y una vez como Objeto. – TcKs

+0

De acuerdo con lo anterior. ¿Puedes publicar cómo se ejemplifica oSheet en ambos casos? – DoctorMick

+0

@Tcks, @DoctorMick, código publicado – KMC

Respuesta

32

Parece que la excepción se produce desde oSheet.Cells[1, 1] y oSheet.Cells[4, 4] utilizados como argumentos en get_range.

aplicación de la siguiente, se lanzará una excepción:

Excel.Range c1 = oSheet.Cells[1, 1]; 
Excel.Range c2 = oSheet.Cells[4, 4]; 
oRange = (Excel.Range)oSheet.get_Range(c1, c2); 
oRange.EntireColumn.AutoFit(); 

Por lo tanto, podría estar relacionado con la funcionalidad oSheet.get_Range. Recibe un objeto como argumento, por lo tanto, podría intentar invocar un método get_Range en los argumentos para recibir la celda interna, y el up-cast desde Range al objeto hecho por el compilador podría ocultar la llamada al método.

Si necesita la definición de celdas por fila/columna, intente utilizar el enfoque anterior.

+0

Que se puede reducir aún más en oRange = (Excel.Range) oSheet.get_Range (oSheet.Cells [1, 1] como Excel.Object, oSheet.Cells [4, 4] como Excel .Objeto); oRange.EntireColumn.AutoFit(); – prabhakaran

18

Utilice en su lugar la propiedad Rango de hoja de trabajo. Por ejemplo, en lugar de

oRange = (Excel.Range)oSheet.get_Range(oSheet.Cells[1, 1],oSheet.Cells[4,4]); 

uso

oRange = (Excel.Range)oSheet.Range[oSheet.Cells[1, 1],oSheet.Cells[4,4]]; 

que estaba usando el método get_Range() ampliamente cuando apalancadas fuera .NET 2. Cuando cambié a .NET 4 Perfil de cliente, tengo también esta excepción. La sustitución de las referencias get_Range() con la propiedad Range abordó esta cuestión para mí.

+0

La solución de NirMH funcionó para mí, pero prefiero esta (que también funciona) –

+1

Claramente, el problema es con el marco 4. Estaba en 3.5, y Get_range estaba funcionando bien. Ahora, en .net4, get_range no funcionará, y el uso de Sheet.Range [] funciona bien – Simon

2

Para cualquiera que tenga este problema, mucho mejor use la conversión explícita, en lugar de crear nuevas variables.

oRange = (Excel.Range)oSheet.get_Range((Excel.Range)oSheet.Cells[1, 1], (Excel.Range)oSheet.Cells[4,4]); 
1

que había mejorado mi proyecto VS C# .Net Framework de 3,5 a 4,5. Una vez que había actualizado correctamente, tengo este "objeto" no contiene una definición de excepción 'get_Range' cuando se trata de generar un informe de Excel.

Lo que hice es en lugar de mediante el siguiente código

range = xlSheet.get_Range(Cells[xlRow, xlCol], Cells[xlRow, xlCol]); 

Reescribí a

range = xlSheet.Range[Cells[xlRow, xlCol], xlSheet.Cells[xlRow, xlCol]]; 

y funcionó.

Cuestiones relacionadas