【问题标题】:Unable to cast COM object of type 'System.__ComObject' to interface type 'Microsoft.Office.Interop.Excel.Worksheets'无法将“System.__ComObject”类型的 COM 对象转换为接口类型“Microsoft.Office.Interop.Excel.Worksheets”
【发布时间】:2017-01-16 11:43:59
【问题描述】:

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

我收到以下错误:

附加信息:无法将“System.__ComObject”类型的 COM 对象转换为接口类型“Microsoft.Office.Interop.Excel.Worksheets”。此操作失败,因为 IID 为“{000208B1-0000-0000-C000-000000000046}”的接口的 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

我不确定我在做什么错所有属性都被声明为公共,Worksheets 是一个有效的集合,WB 属性类型是 Excel._workbook,WSS 属性类型是 Excel.worksheets。

任何想法我错过了什么?

【问题讨论】:

标签: .net excel vb.net excel-interop


【解决方案1】:

使用Sheets 实例:

Sheets 集合可以包含 Chart 或 Worksheet 对象。当您想要返回任何类型的工作表时,Sheets 集合很有用。如果您只需要使用一种类型的工作表,请参阅该工作表类型的对象主题。

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

Public WSS As Excel.Worksheets = Nothing

收件人:

Public WSS As Excel.Sheets = Nothing

此外,我还注意到您使用的_Workbook_Worksheet 无法访问DocEvents_Event 成员。

您应该考虑使用继承自_WorkbookWorkbook 和继承自_WorksheetWorksheetWorksheetWorkbook 都继承自 DocEvents_Event,这使您可以访问以下成员:

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

最后,您应该转一下Option Strict On。这将帮助您编写更好的代码并在编译时生成潜在的运行时错误。就目前而言,这种代码WS = WSS(1),在 Option Strict On 的情况下,将产生以下编译错误:

Option Strict On 不允许从 'Object' 到 'Microsoft.Office.Interop.Excel.Worksheet' 的隐式转换。

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

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

在您的情况下,这可能不会产生运行时错误,但是通过启用 Option Strict On 您可以为自己省去很多麻烦。

【讨论】:

    【解决方案2】:

    这是一种类型混淆。

    WB.Worksheets 返回Sheets 的集合

    所以你需要

        Dim WSS As Excel.Sheets = Nothing
    

    【讨论】:

      猜你喜欢
      • 2018-06-20
      • 2018-08-08
      • 1970-01-01
      • 1970-01-01
      • 2014-03-20
      • 2010-12-02
      • 1970-01-01
      • 2016-02-02
      相关资源
      最近更新 更多