【问题标题】:Exception in Excel 2007 operation on VistaVista 上 Excel 2007 操作中的异常
【发布时间】:2009-09-01 14:50:42
【问题描述】:

我在 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 可以完美运行。

抛出执行的那段代码是,

/* 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 块中编写了这段代码,我也无法处理它。

任何人都可以提出任何解决方案吗?

谢谢,

阿米特

【问题讨论】:

    标签: c# .net excel


    【解决方案1】:

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

    您可以下载免费试用版here

    免责声明:我拥有 SpreadsheetGear LLC

    【讨论】:

      【解决方案2】:

      很难确定是什么原因造成的。所以,首先是几个问题,您可以通过编辑上面的原始问题来回复或澄清。

      (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.xlWBATChartExcel.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();
      

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

      如果这些都不能解决问题,您应该回复一些关于我强调的所有这些项目的更多信息,和/或包括您在此期间可能想到的任何其他内容。

      我为你祈祷...

      迈克

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-08-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多