Excel Interop:应用程序和应用程序类的区别

问题描述:

我遇到了excel interop的问题。基本上,我想要做的就是用一个复杂的参数类型在.NET中调用一个Excel工作簿中的宏。然而,在这样做的时候,我遇到了Application和ApplicationClass之间的一些差异,这给我带来了一些麻烦。Excel Interop:应用程序和应用程序类的区别

下面是一些代码:

Dim complexType As New BigBadClass 

Dim result As Boolean = importerClass.ExcelApplication.ComObject.GetType().InvokeMember("Run", _ 
      Reflection.BindingFlags.Default + Reflection.BindingFlags.InvokeMethod, Nothing, _ 
      importerClass.ExcelApplication.ComObject, _ 
      New Object() {"TheMacroName", AStringValue, ALongValue, complexType}) 

以Excel VBA宏,复杂类型被映射到对象。 (有趣的一面是,我在C#中首先尝试了这种方式,并且不断得到类型不匹配异常,它与C#代码之间的唯一区别在于它传递给在VB.NET中创建的complexType,并且传入的C#版本在C#中创建一个complexType。出于某种原因,我还没有找到(对象类型的某种微妙差异?),C#之一失败,而VB.NET之一)

无论如何,与上面的代码片段。它只适用于ExcelApplication.ComObject是ApplicationClass,而不是应用程序接口。应用程序没有GetType()成员。而且由于它们是COM类,所以你不能施放它们。如果可能的话,我倾向于使用Application,因为我有另一块,它将通过使用GetObject(..)自动为用户加载打开的工作簿,并且在使用ApplicationClass时会中断(因为您再次无法投射COM类,因此您只能投射GetObject(..)进入应用程序界面)。

有没有人遇到过这个问题?
有没有办法像ApplicationObject一样使用GetObject(..)?
还是一种使用GetType()和Application的方法? 或者可能有一些方法来投射COM对象?即:铸造应用程序到应用程序类

希望我的解释足够清楚,代码说明了我在做什么。

这应该是你的兴趣:

Run macro using VB.Net

我看到反射的第二个我知道这是不完全正确。

仅供参考我贴的代码可用来源:

Dim oExcel As Excel.ApplicationClass 
    Dim oBook As Excel.WorkbookClass 
    Dim oBooks As Excel.Workbooks 

    'Start Excel and open the workbook.' 
    oExcel = CreateObject("Excel.Application") 
    oExcel.Visible = True 
    oBooks = oExcel.Workbooks 
    oBook = oBooks.Open("c:\book1.xls") 

    'Run the macros.' 
    oExcel.Run ("DoKbTest") 
    oExcel.Run("DoKbTestWithParameter", "Hello from VB .NET Client") 

    'Clean-up: Close the workbook and quit Excel.' 
    oBook.Close (False) 
    System.Runtime.InteropServices.Marshal.ReleaseComObject (oBook) 
    oBook = Nothing 
    System.Runtime.InteropServices.Marshal.ReleaseComObject (oBooks) 
    oBooks = Nothing 
    oExcel.Quit() 
    System.Runtime.InteropServices.Marshal.ReleaseComObject (oExcel) 
    oExcel = Nothing 
+0

卫生署,我觉得像这样的小玩意儿。我实际上已经在C#中尝试过这种方法,但它不起作用(由于我的问题在括号中的原因可能......而且我真的不想使用Missing.Value 30次:)),但我从不甚至试图在VB.NET中使用它。现在一切正常。谢谢。 – 2009-10-06 22:49:00

+0

我讨厌互操作。新的C#有一种调用办公互操作的新方法,它具有更好的函数调用格式(几乎与VB相同)C#可能不工作,因为C#中的投射是明确的,您可能需要推送(对象)myobject在通话使它工作,再加上函数调用所有30 Ref.missing :)。 – Spence 2009-10-07 00:36:22