我正在编写一个使用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
我不确定我做错了什么属性都声明为public,Worksheets是一个有效的集合,WB属性类型是Excel._workbook,WSS属性类型是Excel.worksheets。
我缺少什么想法?
答案 0 :(得分:0)
这是一种混淆。
WB.Worksheets
会返回Sheets
所以你需要
Dim WSS As Excel.Sheets = Nothing
答案 1 :(得分:0)
使用Sheets实例:
Sheets集合可以包含Chart或Worksheet对象。当您想要返回任何类型的工作表时,Sheets集合非常有用。如果您只需要使用一种类型的工作表,请参阅该工作表类型的对象主题。
考虑到这一点,请更改以下声明:
Public WSS As Excel.Worksheets = Nothing
要:
Public WSS As Excel.Sheets = Nothing
此外,我还注意到您使用的_Workbook和_Worksheet无法访问DocEvents_Event成员。
您应该考虑使用继承自_Workbook
的{{1}}和Workbook继承的Worksheet。 _Worksheet
和Worksheet
都继承自Workbook
,可让您访问以下成员:
如果您想使用处理程序但是认为值得注意,这只会很重要。
最后,在较小的音符上,您应该转为 Option Strict On 。这将有助于您编写更好的代码并在编译时生成潜在的运行时错误。就目前而言,这种代码DocEvents_Event
,其中Option Strict On,将产生以下编译错误:
Option Strict On禁止来自&#39;对象&#39;的隐式转换to&#39; Microsoft.Office.Interop.Excel.Worksheet&#39;。
编译器通常会建议修复,在这种情况下修复将是:
WS = WSS(1)
在你的情况下,这可能不会产生运行时错误,但是通过Option Strict On你可以为自己节省很多的悲伤。