web-dev-qa-db-fra.com

Erreur de classe non enregistrée lors de la création d'un classeur Excel en C #

Lorsque j'essaie d'accéder à une feuille de calcul Excel à l'aide du code suivant, j'obtiens une erreur "Bibliothèque non enregistrée" lors de la définition de l'objet classeur wrkbuk à l'aide de C # à partir de Visual Studio 2012 avec Office 2007 (ver 12) installé

Microsoft.Office.Interop.Excel.Application excapp = new Microsoft.Office.Interop.Excel.Application();
        string bookname = @"C:\Users\Public\Documents\RECRUITMENT & SELECTION\MOVEMENTS\MOVEMENTS\Miscellaneous Documents\VacanciesREAL.xls";
        Workbook wrkbuk = excapp.Workbooks.Open(bookname); 
        Worksheet wrksht = new Worksheet();

Les détails de l'erreur sont

System.InvalidCastException était non géré HResult = -2147467262
Message = Impossible de convertir un objet COM de type 'Microsoft.Office.Interop.Excel.ApplicationClass' en interface de type 'Microsoft.Office.Interop.Excel._Application'. Cette opération a échoué car l'appel QueryInterface sur le composant COM pour l'interface avec l'IID "{000208D5-0000-0000-C000-000000000046}" a échoué en raison de l'erreur suivante: bibliothèque non enregistrée. (Exception de HRESULT: 0x8002801D (TYPE_E_LIBNOTREGISTERED)). Source = mscorlib

J'ai créé une référence à Microsoft.Office.Interop.Excel.dll dans l'assembly Interop principal Office 14 fourni avec VS 2012 et également pour la version Office 12 de la DLL et aucun des deux ne résout le problème. J'ai essayé d'enregistrer les dll avec regasm mais cela n'aide pas non plus.

Je peux créer la feuille de calcul wrksht sur la ligne suivante OK avec les DLL Office 14 et Office 12 afin que le problème semble n'affecter que la définition du classeur.

17 décembre 2013

J'ai essayé de réinstaller Office 2007 en vain, mais j'ai trouvé cette solution, qui a fonctionné. C'était à

http://social.msdn.Microsoft.com/Forums/vstudio/en-US/d3f92da7-96d3-404b-89d0-d236800ceae5/vs-2012-rc-and-visual-studio-tools-for- bureau? forum = vsto

Le problème est le code de plusieurs versions d'Office - j'avais du code d'Office 14, provenant probablement de l'installation de VS 2012

Je soupçonne que VS 2012 RC a installé les bibliothèques de types Office 2013 et qu'il existe désormais des versions en double enregistrées. J'ai ce message d'erreur spécifique

('impossible de caster _Application' .... 'TYPE_E_LIBNOTREGISTERED')

après une désinstallation en désordre, puis en réinstallant une ancienne version d'Office. Je l'ai résolu en suivant les conseils d'un autre fil de forum ici que je ne peux malheureusement pas trouver ... en gros, j'ai recherché le CLSID dans le registre dans le message d'erreur, donc, {00020970-0000-0000-C000-000000000046}. Sa clé de registre contenait deux clés, dont l'une était appelée "TypeLib", qui contenait à son tour un autre CLSID pour la bibliothèque de types. J'ai ensuite cherché dans le registre, en recommençant au début, ce deuxième CLSID, qui m'a conduit à la bibliothèque de types d'interopérabilité pertinente. Il y avait deux entrées ... 8.3 et 8.4, le plus grand nombre correspondant à la dernière version d'Office .... que j'ai supprimé ... et j'ai immédiatement pu exécuter mon programme.

33
SimonKravis

J'ai eu exactement le même problème. Voici comment je l'ai corrigé:

Aller à

HKEY_CLASSES_ROOT\TypeLib\ Et recherchez Office.Interop.Excel.

J'ai trouvé HKEY_CLASSES_ROOT\TypeLib\(guid)\1.8 mais ses nœuds enfants étaient vides! Je l'ai supprimé parce qu'Office 15 n'était pas installé sur cette machine, et hé hop - ça a marché.

Soit notre installateur de projet VSTO, soit notre propre installateur personnalisé doit y avoir placé le dossier 1.8.

J'ai trouvé la solution ici:

Erreur d'accès aux composants COM

32
stuzor

J'avais exactement le même problème. Si vous avez installé une nouvelle version d'Office et pour une raison quelconque, vous devez installer l'ancienne version sans supprimer la nouvelle (pour mon cas, j'ai juste besoin d'installer Office XP Photo Editor) et cela a causé le problème.

Après avoir passé 3 heures de haut en bas, le meilleur moyen est de réparer la nouvelle version d'Office et tout est revenu à la normale comme il se doit.

J'espère que ces informations vous aideront à condition d'avoir le même scénario ou un scénario similaire.

7
Anand

Je confirmerai la réponse de @stuzor sur deux machines que j'ai rencontrées.

Contexte:

Windows7 64 bit
Office 2010 (32bit) 
Lync 2013 

HKEY_CLASSES_ROOT\TypeLib \, a recherché "Office.Interop.Excel". Trouvé le dossier "1.8" à peine existant. Après la suppression, la fonction d'une ancienne application VB.net a commencé à fonctionner immédiatement.

6
matt.bungard

Quelque chose qui n'a pas été mentionné ici mais qui peut être utile est que les sous-clés de 1.XX peuvent également causer des problèmes. Par exemple: Sous Computer\HKEY_CLASSES_ROOT\TypeLib {00020813-0000-0000-C000-000000000046} J'avais la sous-clé 1.9. Celui-ci a à son tour la sous-clé (ou devrait). Maintenant sous cela, il y avait deux sous-clés - Win32 et Win64. Par conséquent, Visual Studio n'a pas pu résoudre l'emplacement de Microsoft.Office.Interop.Excel.dll - il lisait deux sous-clés où il ne pouvait en lire qu'une. La suppression de la sous-clé Win32 a complètement résolu mon problème. Veuillez noter que cela a été fait après une réinstallation complète de VS 2017 et Office 365 Pro Plus. J'espère que cela aide quelqu'un.

3
VBAMadeMeDoIt

Le hack de registre décrit ci-dessus a résolu le même problème pour moi. La seule différence était que j'avais une entrée de 1,9 et 1,7. J'ai supprimé la clé 1.9 et mon problème a été résolu.

Autre info:

Système d'exploitation: Windows 10

Visual Studio Professional 2015

Application de formulaire Windows C #

C'était sur mon ordinateur portable de travail. Office 2010 est installé sur chaque poste de travail.

Certaines autres choses que j'ai essayées DID NOT WORK étaient les suivantes:

Réparation de MS OFFICE

Réinstallation de MS OFFICE

Téléchargement de Microsoft Office 2010: assemblys d'interopérabilité principaux depuis Microsoft.

J'ai également eu plusieurs versions de Microsoft.Office.Interop.Excel.dll sur mon ordinateur portable. La suppression des versions précédentes n'a pas résolu le problème.

Heureux d'être allé sur STACKOVERFLOW.COM parce que cet endroit ROCKS !!!!!!

1
P. Mennetti

Ceci est une réponse si vous ne pouvez pas modifier ou supprimer les enregistrements regedit. J'ai eu le même problème, dans l'entreprise où je travaille, il y a une trentaine de machines avec office 2010 et je n'ai pas pu effacer ou ouvrir des enregistrements dans le regedit. parce que la machine cliente était dans un domaine qui ne me le permettait pas. même si j'avais des autorisations d'administrateur, cela ne me permettait pas de supprimer des enregistrements dans le regedit. J'ai essayé de trouver une solution pendant 1 mois et je ne l'ai pas trouvée. j'ai donc dû arrêter d'utiliser l'interopérabilité et migrer vers OpenXml pour modifier les modèles Excel et ClosedXml pour créer un nouvel Excel. Cela m'a sauvé la vie, car mon patron me pressait déjà.

Ouvrez le projet/la solution dans Visual Studio et ouvrez la console à l'aide de la commande Outils> Gestionnaire de package NuGet> Console du gestionnaire de package. et installez 2 packages

  1. Install-Package DocumentFormat.OpenXml -Version 2.5.0
  2. Feuille de calcul du package d'installation

pd: OpenXml 2.8 ne fonctionne pas avec SpreadsheetLight, mieux utiliser 2.5.0

ajouter ceci au début

using DocumentFormat.OpenXml;
using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Spreadsheet;
using SpreadsheetLight;

dans votre bouton ou classe copiez et modifiez

    SaveFileDialog fichero = new SaveFileDialog();
    fichero.Filter = "Excel (*.xlsx)|*.xlsx";
    if (fichero.ShowDialog() == DialogResult.OK)
    {
        SLDocument sl = new SLDocument("c:\\bin\\est1.xlsx", "Sheet1");

        sl.SetCellValue("E9", "Let's party!!!!111!!!1");

        sl.SelectWorksheet("Sheet2");
        sl.SetCellValue("C7", "Before anyone calls the popo!");

        sl.AddWorksheet("ERTRT");
        sl.SetCellValue("B4", "Who let the dogs out?");
        sl.SetCellValue("B5", "Woof!");

        sl.SaveAs(fichero.FileName);    

        MessageBox.Show("Report " + fichero.FileName + "!");
    }
1
Aliendo

Eu le même problème ... Le code qui était en cours d'exécution, a commencé à lancer la même exception lorsqu'une nouvelle instance d'application a été créée. Pour résoudre ce problème:

  1. Programmes et fonctionnalités , a fait une commande par date d'installation et a pu voir qu'il y avait des mises à jour de Microsoft Office 365 le jour même où le code avait cessé de fonctionner.
  2. Pour les deux Microsoft Office 365 -en-us et Microsoft Office 365 Pro Plus -en-us , faites un clic droit Changez et sélectionnez Correction rapide

J'ai essayé d'exécuter ma solution et cela fonctionnait à nouveau.

0
Carolina_G

Nous avons eu le même problème.

Notre configuration est la suivante:
Office 2010: Word et Excel mais Office 2013: Outlook

Nous avons exécuté le programme d'installation d'Office 2010 et choisissez l'option de réparation. Après cela, toutes les clés incorrectes dans le Registre pour Word et Excel ont été supprimées et le problème a été résolu.

0
cpelletier