.net 无法强制转换类型为';系统。共对象';至接口类型';Microsoft.Office.Interop.Excel.Worksheets';

.net 无法强制转换类型为';系统。共对象';至接口类型';Microsoft.Office.Interop.Excel.Worksheets';,.net,excel,vb.net,excel-interop,.net,Excel,Vb.net,Excel Interop,我正在编写一个利用Microsoft.Office.Interop.Excel程序集的类。它是“一站式”DLL库的一部分,将在java解决方案中使用(以限制java端的接口数量) 我得到以下错误: 其他信息:无法将“System.\u ComObject”类型的COM对象强制转换为接口类型“Microsoft.Office.Interop.Excel.Worksheets”。此操作失败,因为对IID为“{000208B1-0000-0000-C000-0000000000 46}”的接口的COM

我正在编写一个利用Microsoft.Office.Interop.Excel程序集的类。它是“一站式”DLL库的一部分,将在java解决方案中使用(以限制java端的接口数量)

我得到以下错误:

其他信息:无法将“System.\u ComObject”类型的COM对象强制转换为接口类型“Microsoft.Office.Interop.Excel.Worksheets”。此操作失败,因为对IID为“{000208B1-0000-0000-C000-0000000000 46}”的接口的COM组件的QueryInterface调用由于以下错误而失败:不支持此类接口(来自HRESULT的异常:0x80004002(E_NOINTERFACE))

这是由以下代码引发的:

Public Class XL

    Public XL As Excel.Application = Nothing
    Public XLN As String
    Public WBS As Excel.Workbooks = Nothing
    Public WBSN() As String
    Public WB As Excel._Workbook = Nothing
    Public WBN As String
    Public WSS As Excel.Worksheets = Nothing
    Public WSSN() As String
    Public WS As Excel._Worksheet = Nothing
    Public WSN As String
    Public XLCelllValue As Object = Nothing

    Public Sub New()

        XL = New Excel.Application()
        XL.Visible = True

        WBS = XL.Workbooks
        WB = WBS.Add()

        WSS = WB.Worksheets '<this is the line that throws the exception
        WS = WSS(1)

    End Sub
End Class
公共类XL
Public XL作为Excel.Application=Nothing
公共XLN作为字符串
将WBS作为Excel公开。工作簿=无
作为字符串的公共WBSN()
将WB作为Excel公开。\u工作簿=无
公共WBN作为字符串
公共WSS作为Excel。工作表=无
作为字符串的公共WSSN()
将WS作为Excel公开。\u工作表=无
公共无线传感器网络作为字符串
Public XLCelllValue作为对象=无
公共分新()
XL=新的Excel.Application()
四十、 可见=真
WBS=XL.工作手册
WB=WBS.Add()
WSS=WB.Worksheets'这是一种类型混淆

WB.工作表
返回
工作表的集合

所以你需要

    Dim WSS As Excel.Sheets = Nothing
使用以下实例:

“图纸”集合可以包含图表或工作表对象。如果要返回任何类型的图纸,“图纸”集合非常有用。如果只需要使用一种类型的图纸,请参见该图纸类型的对象主题

考虑到这一点,更改以下声明:

Public WSS As Excel.Worksheets = Nothing
致:

此外,我还注意到,您正在使用和,并且没有访问成员的权限

您应该考虑使用<代码> >工作手册继承,它继承自<代码>工作表< /代码>。

工作表
工作簿
都继承自
DocEvents\u Event
,您可以访问以下成员:

只有当您想使用处理程序但认为值得注意时,这才有意义

最后,在一个小音符上,你应该打开。这将帮助您编写更好的代码,并在编译时生成潜在的运行时错误。目前,这种带有选项Strict On的代码将创建以下编译错误:

Option Strict On不允许从“Object”隐式转换为“Microsoft.Office.Interop.Excel.Worksheet”

编译器通常会建议修复,在这种情况下,修复将是:

WS = CType(WSS(1), Excel.Worksheet)

在您的情况下,这可能不会产生运行时错误,但是通过对选项进行严格限制,您可以省去很多痛苦。

作为我遇到的答案的补充,这可能对您有用。很好。回答得很好@Jink88909
WS = CType(WSS(1), Excel.Worksheet)