在Excel 2007上运行Vista的例外情况

时间:2009-09-01 14:50:42

标签: c# .net excel

我在C#.net中开发了一个控制台应用程序,它创建了一个新的excel&在其中执行一些操作[Interop]。

我在项目中添加了Interop.Microsoft.Office.Interop.Excel.dll作为参考

该代码在XP&在Vista中也是如此。但是,如果我将我的exe保存在其中一个文件夹中,那么它会给我一个感觉

  

检索具有CLSID {00024500-0000-0000-C0的组件的COM类工厂   00-000000000046}由于以下错误而失败:80090006。

     

未处理的异常:System.Exception:执行期间未处理的异常--->    System.NullReferenceException:未将对象引用设置为对象的实例。

任何人都知道这是否可行,因为可能已在任何文件夹上设置了更严格的政策。我问这个是因为,如果我将这个exe文件复制到另一个文件夹,exe就可以完美运行。

抛出execption的代码片段是

/* 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;
  // ...

即使我在try-catch块中编写了这段代码,我也无法处理它。

有人可以建议任何解决方案吗?

谢谢,

阿米特

2 个答案:

答案 0 :(得分:0)

很难确定导致这种情况的原因。所以,首先是几个问题,您可以通过编辑上面的原始问题来回复或澄清。

(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)似乎你有一个在某处定义InteropExcel的using语句?像这样:

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或{ {1}}确定要创建的工作簿的类型。同样,通常,传入Excel.XlWBATemplate.xlWBATWorksheet时应省略此参数。 (有关详细信息,请参阅Workbooks.Add Method上的帮助。)

因此,我建议你改变你的行:

Type.Missing

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

(6)一般来说,你应该使用oWorkbook = (InteropExcel.Workbook)appExcel.Workbooks.Add(Type.Missing); 而不是Application。我知道这看起来很奇怪,因为ApplicationClass是一个接口,创建一个Excel.Application接口似乎很矛盾,但这就是自动化MS Office程序时应该怎么做。 (有关详情,请参阅Don't use ApplicationClass (unless you have to)Excel interop: _Worksheet or Worksheet?。)

因此,你的行:

new

应改为:

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

我不知道哪些问题导致了您的问题,可能其中一些问题在这里发挥作用,但所有问题都应该进行检查和/或纠正。希望其中一个可以纠正你的问题。

如果这些都没有解决,你应该回复一些我已经突出显示的所有这些项目的更多信息,和/或包括你可能已经想到的其他任何事情。

我的手指交叉了你......

麦克

答案 1 :(得分:0)

SpreadsheetGear for .NET从.NET应用程序(包括控制台应用程序)更容易使用和部署,并且通过COM Interop比Excel快得多。

您可以下载免费试用here

免责声明:我拥有SpreadsheetGear LLC