为什么不能从Excel互操作中设置转换对象?

Ang*_*ker 10 c# excel interop .net-2.0

尝试获取对工作表的引用(使用Excel interop):

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; 
Run Code Online (Sandbox Code Playgroud)

错误是它无法投射它:

无法将"System .__ ComObject"类型的COM对象转换为接口类型"Microsoft.Office.Interop.Excel.Worksheets".此操作失败的原因是对IID"{000208B1-0000-0000-C000-000000000046}"的界面处的COM组件调用QueryInterface失败,因为以下错误:不支持此接口(从HRESULT异常:0x80004002(E_NOINTERFACE)) .

我的演员是不正确的?

Aar*_*ght 8

是的,你的演员是错的.

_Workbook.Sheets为您提供了一个Sheets实例.此界面为您提供所有类型的工作表,而不仅仅是工作表; 主要包括图表,宏观表等.

另一方面,Worksheets界面只为您提供工作表 - 而不是图表.

接口不能相互分配; 因此,您收到COM错误.令人困惑的是 - 我甚至不确定是否有可能Worksheets通过PIA 获得接口的实例- 但那是Office Interop for ya.

只要你使用_Workbook.Worksheets属性而不是_Workbook.Sheets属性,你应该得到一个Sheets只返回Worksheet对象的实例- 尽管接口能够提供其他类型的工作表.