很难确定是什么原因造成的。所以,首先是几个问题,您可以通过编辑上面的原始问题来回复或澄清。
(1) 当您说您引用了“Interop.Microsoft.Office.Interop.Excel.dll”时,我假设您的意思是Microsoft.Office.Interop.Excel.dll?
另外,如果您检查此参考的属性,是否表明它的位置在 GAC 中?您可以通过进入解决方案资源管理器、展开项目、展开引用、右键单击 Microsoft.Office.Interop.Excel 引用然后检查 Path 属性来检查这一点。如果在 GAC 中,Path 属性应以“C:\Windows\Assembly\GAC...”开头。
(2) 您似乎还有一个 using 语句在某处定义 InteropExcel?像这样的:
using InteropExcel = Microsoft.Office.Interop.Excel;
这是正确的,还是 InteropExcel 是一个单独的参考?
(3) 当您说要移动 exe 时,您是仅移动 exe,还是移动包含 exe 和相关文件的整个文件夹? .NET 程序集不是自包含的,它需要引用、配置文件和/或其他文件与 exe 位于同一文件夹中,或者有时位于包含 exe 的同一文件夹的子文件夹中。确保将所有内容一起移动。
(4) 您应该在调试模式下运行您的代码,托管在 Visual Studio IDE 中,这样您就可以准确地知道哪一行引发了异常。我的猜测是你的第一行返回null:
appExcel = new InteropExcel.ApplicationClass();
然后我认为你的下一行是抛出一个NullReferenceException,因为你的“appExcel”引用为空:
oWorkbook = (InteropExcel.Workbook)appExcel.Workbooks.Add(true);
(嗯...实际上,我想得越多,这就越没有意义。未经测试,但我不希望对appExcel = new InteropExcel.ApplicationClass()的调用会悄悄返回null。我希望它会要么正确返回应用程序对象,要么抛出异常,但不会通过返回null 悄悄地失败。但也许。如果不是,那么我认为您的异常可能发生在您的代码之外的某些代码中显示。所以你真的需要在 Visual Studio IDE 中运行它,这样你就可以知道哪一行出错了。)
(5) 此外,您对Workbooks.Add 方法的调用不正确。 Template 参数用于确定哪个工作簿(如果有)应充当新工作簿的模板。一般来说,传入的参数应该是Type.Missing,才能省略这个参数;这将允许基于默认的空白工作簿创建新工作簿。如果您确实传递了一个参数,它可以是一个字符串,其中包含您希望用作新工作簿模板的工作簿的完整路径,也可以是一个 Excel.XlWBATemplate 常量,例如 Excel.XlWBATemplate.xlWBATChart 或 Excel.XlWBATemplate.xlWBATWorksheet 来确定要创建的工作簿类型。同样,一般情况下,应通过传入Type.Missing 来省略此参数。 (有关更多信息,请参阅Workbooks.Add Method 上的帮助。)
因此,我建议您将您的线路从:
oWorkbook = (InteropExcel.Workbook)appExcel.Workbooks.Add(true);
到
oWorkbook = (InteropExcel.Workbook)appExcel.Workbooks.Add(Type.Missing);
(6) 通常你应该使用Application 而不是ApplicationClass。我知道这看起来很奇怪,因为Excel.Application 是一个接口,而创建new 接口似乎是自相矛盾的,但在自动化 MS Office 程序时应该这样做。 (有关更多信息,请参阅 Don't use ApplicationClass (unless you have to) 和 Excel interop: _Worksheet or Worksheet?。)
因此,你的台词:
InteropExcel.ApplicationClass appExcel = null;
appExcel = new InteropExcel.ApplicationClass();
应该是:
InteropExcel.Application appExcel = null;
appExcel = new InteropExcel.Application();
我不知道这些问题中的哪一个导致了您的问题,可能其中一些问题在这里起作用,但所有问题都应该检查和/或纠正。希望其中之一能解决您的问题。
如果这些都不能解决问题,您应该回复一些关于我强调的所有这些项目的更多信息,和/或包括您在此期间可能想到的任何其他内容。
我为你祈祷...
迈克