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