为什么不能设置从Excel互操作的对象?

试图获得对工作表的引用(使用Excel互操作):

Excel.Application xl = new Excel.ApplicationClass(); Excel.Workbooks xlWorkBooks = xl.Workbooks; Excel.Workbook xlWorkBook = xlWorkBooks.Open(fileName, 0, false, 5, "", "", true, Excel.XlPlatform.xlWindows, "\t", false, false, 0, true, 1, 0); // Next line crashes Excel.Worksheets xlWorkSheets = (Excel.Worksheets) xlWorkBook.Worksheets; 

错误是它不能施放它:

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

我的投射不正确?

是的,你的演员是错的。

_Workbook.Sheets为您提供了一个Sheets实例。 这个界面给你所有types的工作表,而不仅仅是工作表。 主要包括图表,macros观表单等。

另一方面, 工作表界面只给你工作表 – 不是图表。

接口不能相互赋值; 因此,你会得到COM错误。 这很令人困惑 – 我甚至不确定是否可以通过PIA获得Worksheets界面的实例,但这是Office的Interop for ya。

只要您使用_Workbook.Worksheets属性而不是_Workbook.Sheets属性,您应该得到仅返回Worksheet对象的Sheets实例 – 尽pipe该接口能够提供其他types的工作表。

根据MSDN , Workbook.Worksheets返回Microsoft.Office.Interop.Excel.Sheets

所以你会这样做:

 Microsoft.Office.Interop.Excel.Sheets sheets = (Microsoft.Office.Interop.Excel.Sheets)xlWorkBook.Worksheets 

或者,假设Excel映射到Microsoft.Office.Interop.Excel (从您的问题出现)

 Excel.Sheets sheets = (Excel.Sheets)xlWorkBook.Worksheets 

如果它在一个环境而不是另一个环境中工作,请检查HK类Root / TypeLibregistry项。

您可能试图运行HKCR \ TypeLib {00020813-0000-0000-C000-000000000046} \ 1.6,但用户安装的内容添加了以下密钥:HKCR \ TypeLib {00020813-0000-0000-C000-000000000046 } \ 1.7导致Interop调用抛出exception。

或者如果不是这样的话,由于不同的操作系统版本,这可能是GAC中的一些东西。

我在运行Windows 7的开发人员计算机上运行过这个问题,并在运行XP的用户计算机上导致了此错误。

这个很奇怪。 根据这个页面 ,它应该是types的Worksheets 。 没有testing – 给它一个旋风?

如果你正在处理Excel 2007+,我会build议使用System.IO.Packaging + System.Xml.Linq(LINQ to XML)来处理Excel工作表。 它更清洁,并且不需要实际安装在运行应用程序的机器上。

你也会碰到更less的COM冲突(比如上面的post)。

如果您正在尝试编辑Excel 2003或更早版本,那么不幸的是我无法为您提供帮助。

这可能发生在升级到最新的Office版本之后。 尝试去程序和function,find安装和“修复”它。 显然,它更新和/或重新注册用于创build这些对象的互操作。

这可能需要结合@codesforcoffee描述的registry修补程序来完成。