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对象?即:铸造应用程序到应用程序类
希望我的解释足够清楚,代码说明了我在做什么。
这应该是你的兴趣:
我看到反射的第二个我知道这是不完全正确。
仅供参考我贴的代码可用来源:
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
卫生署,我觉得像这样的小玩意儿。我实际上已经在C#中尝试过这种方法,但它不起作用(由于我的问题在括号中的原因可能......而且我真的不想使用Missing.Value 30次:)),但我从不甚至试图在VB.NET中使用它。现在一切正常。谢谢。 – 2009-10-06 22:49:00
我讨厌互操作。新的C#有一种调用办公互操作的新方法,它具有更好的函数调用格式(几乎与VB相同)C#可能不工作,因为C#中的投射是明确的,您可能需要推送(对象)myobject在通话使它工作,再加上函数调用所有30 Ref.missing :)。 – Spence 2009-10-07 00:36:22