10
votes

Pourquoi ne peut-il pas définir jeter un objet d'Excel Interop?

essayer d'obtenir une référence aux feuilles de calcul (à l'aide d'Excel Interop): xxx

L'erreur est qu'elle ne peut pas la jeter:

Impossible de lancer un objet COM de type 'System .__ ComObject' to Interface Type 'Microsoft.Office.interop.excel.worksheets'. Cette opération a échoué car l'appel à QueryInterface sur le composant COM de l'interface avec IID '{000208B1-0000-0000-C000-00000000000046}' a échoué en raison de l'erreur suivante: Aucune interface de ce type supporté (exception à partir de HRESULT: 0x80004002 (e_nointerface)) .

est ma coulée incorrecte?


0 commentaires

6 Réponses :


0
votes

Si vous traitez avec Excel 2007+, je vous suggère d'utiliser System.IO.Packaging + System.XML.LINQ (LINQ à XML) pour manipuler des feuilles Excel. C'est beaucoup plus propre et de ne pas nécessiter Excel d'être installé sur la machine que vous utilisez votre application.

Vous rencontrerez également moins de collisions COM (telles que ci-dessus dans votre message).

Si vous essayez d'éditer Excel 2003 ou plus tôt, alors malheureusement, je suis incapable de vous aider.


1 commentaires

Cette question est étiquetée .NET-2.0 , ce qui signifie qu'il ne peut pas utiliser LINQ vers XML ou l'une des classes d'emballage. Même s'il le pouvait, cela ne répondrait toujours pas à la question.



2
votes

Odd One. Selon Cette page , il est censé être de type feuilles pas Feuilles de calcul . N'a pas testé - donnez-lui un tourbillon?


0 commentaires

4
votes

Selon MSDN , workbook.worksheets code> renvoie microsoft.office.interop.excel.sheets code>.

Vous le feriez comme ça: xxx pré>

ou en supposant Excel code> Maps sur microsoft.office.interop.excel code> (comme apparaît de votre question) p >

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


0 commentaires

8
votes

Oui, votre moulage est faux.

_workbook.sheets vous donne un feuilles instance. Cette interface vous donne tous les types de feuilles, pas seulement des feuilles de calcul; Principalement, il comprend des graphiques, des feuilles de macro, etc.

D'autre part, le feuilles de calcul interface ne vous donne que des feuilles de calcul - pas des graphiques.

Les interfaces ne sont pas assignables les unes aux autres; Par conséquent, vous obtenez l'erreur COM. C'est déroutant - je ne suis même pas sûr s'il est possible d'obtenir une instance de la feuille de calcul interface via la PIA - mais c'est Office Interop pour ya.

Tant que vous utilisez la propriété _workbook.worksheets au lieu de la propriété _workbook.sheets , vous devez obtenir une instance de feuilles que ne renvoie que la feuille de travail malgré le fait que l'interface est capable de fournir d'autres types de feuilles.


3 commentaires

@Zach & @joel a raison aussi, mais vous étiez le premier à la porte de départ, le chèque vert.


Même si cela est assez bien documenté, cela pourrait être l'une des questions / réponses qui rendent si utile.


Merci pour ça. "Gotcha" pour moi était que excel.workbook.worksheets renvoie un Excel.heets objet - pas un Excel.worksheets objet.



3
votes

Si cela fonctionne sur un environnement mais pas un autre, vérifiez les clés de racine de la racine de classes HK / Typelib.

Il est possible que vous essayiez de courir pour Hkcr \ typelib {00020813-0000-0000-C000-000000000046} \ 1.6 Mais quelque chose que l'utilisateur installé a ajouté la clé: HKCR \ TYPELIB {00020813-0000-0000-C000-00000000000046} \ 1.7 provoquant l'appel interopté pour lancer une exception.

ou si ce n'est pas cela, cela pourrait être quelque chose dans le GAC en raison de versions différentes.

J'ai eu ce problème où il a fonctionné sur nos machines de développeur exécutant Windows 7 et a provoqué cette erreur sur la machine d'un utilisateur exécutant XP.


0 commentaires

0
votes

Cela pourrait être arrivé après et mettez à niveau vers la dernière version Office. Essayez d'aller aux programmes et aux fonctionnalités, à trouver l'installation et à la réparer ». Apparemment, il a mis à jour et / ou réinscrit la DLL interoption utilisée pour créer ces objets.

Cela peut avoir besoin d'être effectué en combinaison avec le correctif de registre décrit par @codesforcoffee.


0 commentaires