2009-09-01 7 views
0

J'ai développé une application de console dans C# .net qui crée un nouveau fichier Excel & qui effectue certaines opérations dans [Interop].Exception dans l'opération Excel 2007 sur Vista

J'ai ajouté Interop.Microsoft.Office.Interop.Excel.dll comme référence dans mon projet

Le code fonctionne très bien sur XP dans Vista & aussi. Mais si je garde mon exe dans l'un des dossier, puis il me donne excception

Retrieving the COM class factory for component with CLSID {00024500-0000-0000-C0 00-000000000046} failed due to the following error: 80090006.

Unhandled Exception: System.Exception: Unhandled exception during execution ---> System.NullReferenceException: Object reference not set to an instance of an object.

Toute personne a une idée si cela pourrait être possible en raison des politiques plus strictes qui auraient pu être définies sur un dossier. Je pose cette question parce que, si je copie cet exe dans un autre dossier, l'exe fonctionne parfaitement.

Le morceau de code où Execption est jeté est,

/* Create spreadsheet update data */ 
InteropExcel.Workbook oWorkbook = null; 
InteropExcel.Worksheet oWorkSheet = null; 
InteropExcel.ApplicationClass appExcel = null; 

try 
{ 
    // Probable at this line 
    appExcel = new InteropExcel.ApplicationClass(); 

    oWorkbook = (InteropExcel.Workbook)appExcel.Workbooks.Add(true); 
    oWorkSheet = (InteropExcel.Worksheet)oWorkbook.ActiveSheet; 
    // ... 

Je suis pas en mesure de le manipuler même je l'ai écrit ce code dans le bloc try-catch.

Quelqu'un peut-il suggérer une solution pour cela?

Merci,

Amit

Répondre

0

Il est difficile de savoir avec certitude ce qui pourrait être la cause. Donc, d'abord quelques questions, auxquelles vous pouvez répondre ou clarifier en éditant votre question originale, ci-dessus.

(1) Lorsque vous dites que vous avez référencé "Interop.Microsoft.Office.Interop.Excel.dll", je suppose que vous voulez dire Microsoft.Office.Interop.Excel.dll?

De plus, si vous vérifiez les propriétés pour cette référence, cela montre-t-il que son emplacement est dans le GAC? Vous pouvez le vérifier en accédant à l'Explorateur de solutions, en développant le projet, en développant les références, en cliquant avec le bouton droit de la souris sur la référence Microsoft.Office.Interop.Excel, puis en vérifiant la propriété Path. Si elle est dans le GAC, la propriété Path doit commencer par "C: \ Windows \ Assembly \ GAC ...".

(2) Il semble également que vous ayez une instruction using qui définit InteropExcel quelque part? Quelque chose comme ceci:

using InteropExcel = Microsoft.Office.Interop.Excel; 

Est-ce exact, ou est le InteropExcel une référence distincte?

(3) Lorsque vous dites que vous déplacez votre exe, déplacez-vous l'exe uniquement, ou le dossier complet qui contient l'exe et les fichiers associés? Un assembly .NET n'est pas autonome, il a besoin des références, des fichiers de configuration et/ou d'autres fichiers pour être dans le même dossier que l'exe, ou parfois dans un sous-dossier du même dossier qui contient l'exe. Assurez-vous de tout déplacer ensemble.

(4) Vous devez exécuter votre code en mode débogage, hébergé à partir de l'IDE de Visual Studio, afin de savoir exactement quelle ligne déclenche une exception.Je pense que votre première ligne est de retour null:

appExcel = new InteropExcel.ApplicationClass(); 

Et puis je pense que votre ligne suivante est de lancer un NullReferenceException, parce que votre référence « appExcel » est nulle:

oWorkbook = (InteropExcel.Workbook)appExcel.Workbooks.Add(true); 

(Hmmm .. Non testé, mais je ne m'attendrais pas à ce qu'un appel à appExcel = new InteropExcel.ApplicationClass() retourne tranquillement null Je m'attendrais à ce qu'il renvoie correctement un objet d'application ou déclenche une exception, mais pas calmement échouer en retournant null Mais peut-être. Si non, alors je pense que votre exception pourrait se produire dans un code en dehors de du code que vous montrez. Vous avez donc vraiment besoin de lancer ceci dans l'IDE de Visual Studio pour savoir quelle ligne échoue.)

(5) De plus, votre appel à la méthode Workbooks.Add n'est pas correct. Le paramètre Template est utilisé pour déterminer quel classeur, le cas échéant, doit servir de modèle pour le nouveau classeur. En général, l'argument transmis doit être Type.Missing afin d'omettre ce paramètre; Cela permettra de créer un nouveau classeur basé sur un classeur vide par défaut. Si vous transmettez un argument, il peut s'agir soit d'une chaîne contenant un chemin d'accès complet au classeur que vous souhaitez utiliser comme modèle pour le nouveau classeur, soit d'une constante Excel.XlWBATemplate telle que Excel.XlWBATemplate.xlWBATChart ou Excel.XlWBATemplate.xlWBATWorksheet pour déterminer le type de classeur devant être créé. Encore une fois, en général, ce paramètre doit être omis en passant en Type.Missing. (Pour en savoir plus, consultez l'aide de Workbooks.Add Method.)

Par conséquent, je vous conseille de changer votre ligne de:

oWorkbook = (InteropExcel.Workbook)appExcel.Workbooks.Add(true); 

à

oWorkbook = (InteropExcel.Workbook)appExcel.Workbooks.Add(Type.Missing); 

(6) En général, vous devriez faire usage de Application et non le ApplicationClass. Je sais que cela semble étrange parce que Excel.Application est une interface, et la création d'une interface new semble paradoxale, mais c'est ainsi que cela devrait être fait lors de l'automatisation des programmes MS Office. (Pour en savoir plus, voir Don't use ApplicationClass (unless you have to) et Excel interop: _Worksheet or Worksheet?.)

Par conséquent, vos lignes:

InteropExcel.ApplicationClass appExcel = null; 
appExcel = new InteropExcel.ApplicationClass(); 

devrait plutôt être:

InteropExcel.Application appExcel = null; 
appExcel = new InteropExcel.Application(); 

Je ne sais pas lequel de ces questions est à l'origine votre problème, probablement quelques-uns d'entre eux sont en jeu ici, mais tous devraient être vérifiés et/ou corrigés. J'espère que l'un d'entre eux corrigera votre problème. Si rien de tout cela ne le résout, vous devriez poster plus d'informations sur tous ces éléments que j'ai mis en surbrillance, et/ou inclure tout ce que vous avez compris entre-temps.

J'ai mes doigts croisés pour vous ...

Mike

0

est plus facile à utiliser et à déployer des applications .NET (y compris les applications de la console) et beaucoup plus rapide que Excel via COM Interop.

Vous pouvez télécharger un essai gratuit here.

Désistement: Je possède SpreadsheetGear LLC

Questions connexes