C# 为什么可以';是否设置从Excel互操作强制转换对象?
尝试获取对工作表的引用(使用Excel互操作): 错误是它无法强制转换它: 无法将“System.\u ComObject”类型的COM对象强制转换为接口类型“Microsoft.Office.Interop.Excel.Worksheets”。此操作失败,因为对IID为“{000208B1-0000-0000-C000-0000000000 46}”的接口的COM组件的QueryInterface调用由于以下错误而失败:不支持此类接口(来自HRESULT的异常:0x80004002(E_NOINTERFACE))C# 为什么可以';是否设置从Excel互操作强制转换对象?,c#,excel,interop,.net-2.0,C#,Excel,Interop,.net 2.0,尝试获取对工作表的引用(使用Excel互操作): 错误是它无法强制转换它: 无法将“System.\u ComObject”类型的COM对象强制转换为接口类型“Microsoft.Office.Interop.Excel.Worksheets”。此操作失败,因为对IID为“{000208B1-0000-0000-C000-0000000000 46}”的接口的COM组件的QueryInterface调用由于以下错误而失败:不支持此类接口(来自HRESULT的异常:0x80004002(E_NOI
我的cast不正确吗?如果您使用的是Excel 2007+,我建议使用System.IO.Packaging+System.Xml.Linq(Linq-to-Xml)来处理Excel工作表。它更干净,不需要在运行应用程序的机器上安装excel 您还将遇到较少的COM冲突(如您的帖子中所述) 如果您试图编辑Excel 2003或更早版本,那么很遗憾,我无法帮助您。奇怪的一个。根据,它应该是
Sheets
类型,而不是Worksheets
。尚未测试-试一试?根据,工作簿。工作表
返回Microsoft.Office.Interop.Excel.Sheets
所以你会这样投:
Microsoft.Office.Interop.Excel.Sheets sheets =
(Microsoft.Office.Interop.Excel.Sheets)xlWorkBook.Worksheets
或者假设Excel
映射到Microsoft.Office.Interop.Excel
(如您的问题所示)
是的,你的演员阵容错了
\u Workbook.Sheets
提供了一个实例。该界面提供所有类型的工作表,而不仅仅是工作表;主要包括图表、宏表等
另一方面,界面只提供工作表,而不是图表
接口不可相互分配;因此,您会得到COM错误。这很让人困惑——我甚至不确定是否有可能通过PIA获得工作表
界面的实例——但这就是Office Interop for ya
只要使用
\u工作簿.Worksheets
属性而不是\u工作簿.Sheets
属性,您应该获得一个只返回工作表
对象的工作表实例,尽管该接口能够提供其他类型的工作表。如果它在一种环境下工作,但在另一种环境下不工作,请检查HK Classes Root/TypeLib reg键
有可能你正试图竞选总统
HKCR\TypeLib{00020813-0000-0000-C000-0000000000 46}\1.6
但是用户安装的东西添加了密钥:
HKCR\TypeLib{00020813-0000-0000-C000-0000000000 46}\1.7
导致互操作调用引发异常
或者,如果不是这样,可能是GAC中的某些东西,因为不同的操作系统版本
我在运行Windows 7的开发人员机器上遇到了这个问题,并在运行XP的用户机器上导致了这个错误。这可能是在升级到最新的Office版本之后发生的。尝试转到程序和功能,查找安装并“修复”它。显然,它更新和/或重新注册了用于创建这些对象的互操作dll
这可能需要结合@codesforcoffee所描述的注册表修复来完成。这个问题被标记为.net-2.0
,这意味着他不能使用Linq to XML或任何打包类。即使他可以,这仍然不能回答这个问题。@Zach&@Joel也是对的,但你是第一个到达出发门的人,绿色检查。尽管这是一个很好的记录,但这可能是一个值得回答的问题/答案。谢谢你。对我来说,问题是Excel.Workbook.Worksheets
返回的是Excel.Sheets
对象,而不是Excel.Worksheets
对象。
Microsoft.Office.Interop.Excel.Sheets sheets =
(Microsoft.Office.Interop.Excel.Sheets)xlWorkBook.Worksheets
Excel.Sheets sheets = (Excel.Sheets)xlWorkBook.Worksheets