无法将“System .__ ComObject”types的COM对象转换为接口types“Microsoft.Office.Interop.Excel.Worksheets”

我在写一个利用Microsoft.Office.Interop.Excel程序集的类。 这是一个“一站式”DLL库的一部分,它将被用于一个Java解决scheme(限制在Java端的接口数量)。

我收到以下错误:

其他信息:无法将“System .__ ComObject”types的COM对象转换为“Microsoft.Office.Interop.Excel.Worksheets”types的接口。 此操作失败,因为IIC“{000208B1-0000-0000-C000-000000000046}”接口的COM组件上的QueryInterface调用失败,原因是出现以下错误:没有支持此接口(exception来自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 

我不知道我在做什么错所有的属性被声明为公共的,工作表是一个有效的集合WB属性types是Excel._workbook和WSS属性types是Excel.worksheets。

任何想法我失踪?

使用表格实例:

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

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

 Public WSS As Excel.Worksheets = Nothing 

至:

 Public WSS As Excel.Sheets = Nothing 

此外,我还注意到,您正在使用_Workbook和_Worksheet ,它们无法访问DocEvents_Event成员。

您应该考虑使用从_Workbookinheritance的_Workbook和Worksheetinheritance的_WorksheetWorksheetWorkbook都inheritance自DocEvents_Event ,它可以让您访问以下成员:

在这里输入图像说明

这只是如果你想使用处理程序,但认为值得注意的事情。

最后,在一个小的笔记,你应该把选项严格打开 。 这将有助于编写更好的代码,并在编译时产生潜在的运行时错误。 就目前而言,这种带有Option Strict On的代码WS = WSS(1)将会产生下面的编译错误:

Option Strict On不允许从“对象”到“Microsoft.Office.Interop.Excel.Worksheet”的隐式转换。

通常编译器会提示一个修复,在这种情况下修复将是:

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

在你的情况下,这可能不会创build一个运行时错误,但是通过使用Option Strict On,你可以节省很多的痛苦。

这是一个混合types。

WB.Worksheets返回Sheets的集合

所以你需要

  Dim WSS As Excel.Sheets = Nothing