Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net Excel互操作:应用程序和应用程序类的差异_.net_Excel Interop - Fatal编程技术网

.net Excel互操作:应用程序和应用程序类的差异

.net Excel互操作:应用程序和应用程序类的差异,.net,excel-interop,.net,Excel Interop,我在excel互操作中遇到问题。基本上,我要做的是使用复杂的参数类型从.NET调用excel工作簿中的宏。然而,在这样做的过程中,我遇到了Application和ApplicationClass之间的一些差异,这让我有些头疼 下面是一些代码: Dim complexType As New BigBadClass Dim result As Boolean = importerClass.ExcelApplication.ComObject.GetType().InvokeMember("Run

我在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映射到对象

(有趣的是,我首先在C#中尝试了这一点,并不断得到类型不匹配的异常,这与C#代码之间的唯一区别是它传入了在VB.NET中创建的complexType,而C#版本传入了在C#中创建的complexType。出于某种原因,我还没有弄清楚(对象类型中的某种细微差别?)C#one失败,而VB.NET one可以工作)

总之,使用上面的代码段。它仅在ExcelApplication.ComObject是ApplicationClass而不是应用程序接口时有效。应用程序没有GetType()因为它们是COM类,所以您不能强制转换它们。如果可能的话,我更喜欢使用Application,因为我有另一个可以通过使用GetObject(..)为用户自动加载打开的工作簿的部分,而这在使用ApplicationClass时会中断(因为您再次无法强制转换COM类,所以您只能强制转换GetObject(..)进入应用程序接口)

以前有人遇到过这个问题吗?
有没有一种方法可以将GetObject(..)之类的东西与ApplicationClass一起使用?
或者是在应用程序中使用GetType()的方法? 或者可以通过某种方式强制转换COM对象?即:将应用程序强制转换为ApplicationClass


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

您应该对此感兴趣:

当我看到倒影的那一刻,我知道这是不对的

仅供参考,我在源代码中发布了可用的代码:

    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

Doh,我觉得自己像个讨厌鬼。我实际上在C#中尝试过这种方法,但它不起作用(由于我问题中括号中的原因很可能……而且我真的不想使用Missing.Value 30倍:),但我甚至从未在VB.NET中尝试过使用它。现在一切都好了。谢谢,我讨厌互操作。新的C#有一种调用office interop的新方法,它的函数调用格式更好(几乎与VB相同)。C#可能不起作用,因为C#中的强制转换是显式的,您可能需要在调用中插入一个(对象)myobject使其工作,再加上函数调用中缺少的所有30个Ref:)。