Excel Interop:Application和ApplicationClass的区别

时间:2009-10-06 22:16:02

标签: .net excel-interop

我遇到了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

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

1 个答案:

答案 0 :(得分:1)

您应该对此感兴趣:

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