2010-04-22 12 views
10

Tratando de obtener una referencia a las hojas de cálculo (utilizando interoperabilidad de Excel):¿Por qué no se puede configurar un objeto desde la interoperabilidad de Excel?

Excel.Application xl = new Excel.ApplicationClass(); 
Excel.Workbooks xlWorkBooks = xl.Workbooks; 
Excel.Workbook xlWorkBook = xlWorkBooks.Open(fileName, 0, false, 5, "", 
         "", true, Excel.XlPlatform.xlWindows, "\t", 
         false, false, 0, true, 1, 0); 

// Next line crashes 
Excel.Worksheets xlWorkSheets = (Excel.Worksheets) xlWorkBook.Worksheets; 

El error es que no puede echarlo:

Unable to cast COM object of type 'System.__ComObject' to interface type 'Microsoft.Office.Interop.Excel.Worksheets'. This operation failed because the QueryInterface call on the COM component for the interface with IID '{000208B1-0000-0000-C000-000000000046}' failed due to the following error: No such interface supported (Exception from HRESULT: 0x80004002 (E_NOINTERFACE)).

¿Es mi lanzamiento incorrecto?

Respuesta

8

Sí, el yeso es un error.

_Workbook.Sheets le ofrece una instancia de Sheets. Esta interfaz le ofrece todo tipo de hojas, no solo hojas de trabajo; principalmente, incluye gráficos, macro hojas, etc.

Por otro lado, la interfaz Worksheets solo le ofrece hojas de trabajo, no gráficos.

Las interfaces no son asignables entre sí; por lo tanto, obtienes el error COM. Es confuso: ni siquiera estoy seguro de si es posible obtener una instancia de la interfaz Worksheets a través del PIA, pero eso es Office Interop for ya.

Mientras se utiliza la propiedad en lugar de la propiedad _Workbook.Sheets_Workbook.Worksheets, usted debe obtener una instancia de Sheets que sólo devuelve Worksheet objetos - a pesar del hecho de que la interfaz es capaz de proporcionar otros tipos de hojas.

+0

@Zach y @Joel tienen razón, pero usted fue el primero en llegar a la puerta de salida, el cheque verde. – AngryHacker

+0

Aunque esto está bastante bien documentado, podría ser una de las preguntas/respuestas que hacen que valga la pena. – TheBlastOne

+0

Gracias por esto. El "gotcha" para mí fue que 'Excel.Workbook.Worksheets' devuelve un objeto' Excel.Sheets', no un objeto 'Excel.Worksheets'. – Lopsided

0

Si está tratando con Excel 2007+ Sugeriría utilizar System.IO.Packaging + System.Xml.Linq (LINQ to XML) para manipular hojas de Excel. Es mucho más limpio y no requiere que Excel esté realmente instalado en la máquina en la que está ejecutando su aplicación.

También se encontrará con menos colisiones COM (como las de arriba en su publicación).

Si está intentando editar Excel 2003 o una versión anterior, desafortunadamente no puedo ayudarle.

+1

Esta pregunta está etiquetada como '.net-2.0', lo que significa que no puede usar Linq en XML o en ninguna de las clases de empaquetado. Incluso si pudiera, esto aún no respondería la pregunta. – Aaronaught

2

Impar uno. De acuerdo con this page, se supone que es del tipo Sheets no Worksheets. ¿No has probado? Dale un giro?

4

De acuerdo con MSDN, Workbook.Worksheets devuelve Microsoft.Office.Interop.Excel.Sheets.

Así que será echado de esta manera:

Microsoft.Office.Interop.Excel.Sheets sheets = 
    (Microsoft.Office.Interop.Excel.Sheets)xlWorkBook.Worksheets 

o asumir Excel mapas a Microsoft.Office.Interop.Excel (como se desprende de su pregunta)

Excel.Sheets sheets = (Excel.Sheets)xlWorkBook.Worksheets 
3

Si funciona en un entorno pero no en otro, compruebe las claves de registro HK Classes Root/TypeLib.

Es posible que usted está tratando de ejecutar para HKCR \ TypeLib {00020813-0000-0000-C000-000000000046} \ 1,6 pero algo que el usuario ha añadido instalada la clave: HKCR \ TypeLib {00020813- 0000-0000-C000-000000000046} \ 1.7 provocando que la llamada Interop genere una excepción.

O si eso no es así, podría ser algo en el GAC debido a las diferentes versiones del sistema operativo.

Tuve este problema donde funcionó en nuestras máquinas de desarrollo que ejecutan Windows 7, y causó este error en la máquina de un usuario que ejecuta XP.

0

Esto podría haber sucedido después y actualizar a la última versión de Office. Intenta ir a Programas y características, encuentra la instalación y "la reparas". Aparentemente, actualizó y/o reinscribió el dll de interoperabilidad utilizado para crear esos objetos.

Esto puede necesitar hacerse en combinación con la corrección de registro descrita por @codesforcoffee.

Cuestiones relacionadas