我遇到了excel互操作的问题。基本上,我要做的是在.NET中使用复杂的参数类型调用excel工作簿中的宏。但是,在这样做的过程中,我遇到了Application和ApplicationClass之间的一些差异,这给我带来了一些麻烦。
以下是一些代码:
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宏中,complexType被映射到Object。
(有趣的是,我首先在C#中尝试了这个并且不断获得Type Mismatch异常,这与C#代码的唯一区别在于它传入了在VB.NET中创建的complexType,并且传入了C#版本在C#中创建的complexType。由于某些原因我还没有弄清楚(对象类型中有某种微妙的差异吗?),C#one失败了,而VB.NET失败了)
无论如何,使用上面的代码片段。它仅在ExcelApplication.ComObject是ApplicationClass而不是Application接口时有效。应用程序没有GetType()成员。由于它们是COM类,因此无法进行转换。我希望尽可能使用Application,因为我有另一篇文章将使用GetObject(..)自动为用户加载打开的工作簿,并且在使用ApplicationClass时会中断(因为你再次无法转换COM类,所以你只能投GetObject(..)到Application接口中。
之前有没有人遇到过这个问题?
有没有办法在ApplicationClass中使用类似GetObject(..)的东西?
或者使用GetType()和Application的方法?
或者可能是某种方式来投射COM对象?即:将应用程序转换为ApplicationClass
希望我的解释足够清楚,代码说明了我在做什么。
答案 0 :(得分:1)
您应该对此感兴趣:
第二次我看到反思我知道这不太对劲。
仅供参考,我已在源上发布了可用的代码:
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