Excel互操作:_Worksheet或工作表?

我目前正在写关于dynamictypes,我给一个Excel互操作的例子。 我之前几乎没有做任何Office互操作,而且它显示。 C#4的MSDN Office Interop教程使用_Worksheet界面,但也有一个Worksheet界面。 我不知道有什么不同。

在我的荒谬简单的演示应用程序(如下所示)或者正常工作 – 但如果最好的做法决定一个或另一个,我宁愿使用它适当。

 using System; using System.Linq; using Excel = Microsoft.Office.Interop.Excel; class DynamicExcel { static void Main() { var app = new Excel.Application { Visible = true }; app.Workbooks.Add(); // Can use Excel._Worksheet instead here. Which is better? Excel.Worksheet workSheet = app.ActiveSheet; Excel.Range start = workSheet.Cells[1, 1]; Excel.Range end = workSheet.Cells[1, 20]; workSheet.get_Range(start, end).Value2 = Enumerable.Range(1, 20) .ToArray(); } } 

我试图避免全面深入地研究COM或Office的互操作性,只是强调了C#4的新function – 但我不想做任何事情,真的很愚蠢。

(在上面的代码中可能有些真正愚蠢的东西,在这种情况下,请让我知道。使用单独的开始/结束单元而不是“A1:T1”是故意的 – 很容易看出它确实是一个范围20个细胞,其他的可能是偶然的)

那么,我应该使用_Worksheet还是Worksheet ,为什么?

如果我记得正确的话 – 而且我的记忆有点模糊,从Excel PIA中分离出来已经很长时间了 – 就像这样。

事件本质上是一个对象在有事情发生时调用的方法。 在.NET中,事件是委托,简单明了。 但是在COM中,将大量的事件callback组织到接口中是很常见的。 因此,您在给定的对象上有两个接口 – “传入”接口,您希望其他人呼叫您的方法,以及“传出”接口,您希望在事件发生时调用其他人的方法。

在非托pipe元数据 – types库 – 对于一个可创build的对象,有三件事情的定义:传入接口,传出接口和coclass,它说:“我是一个可创build的对象,实现这个传入接口,这传出界面“。

现在,当types库被自动翻译成元数据时,可悲的是,这些关系被保留下来。 有一个手工生成的PIA会更好,这使得类和接口更符合我们在pipe理世界所期待的,但可悲的是,这并没有发生。 因此Office PIA充满了这些看似奇怪的重复,每个可创build的对象似乎都有两个与之相关的接口,其中有相同的东西。 其中一个接口代表了coclass的接口,其中一个接口代表了该coclass的接口。

_Workbook接口是工作簿共同体上的传入接口。 Workbook接口是表示coclass本身的接口,因此inheritance自_Workbook。

长话短说,如果您可以方便地使用Workbook,我会使用Workbook; _Workbook是一个实现细节。

如果您在Reflector查看PIA程序集(Microsoft.Office.Interop.Excel),则Workbook界面具有此定义…

 public interface Workbook : _Workbook, WorkbookEvents_Event 

Workbook_Workbook但添加事件。 同样的Worksheet (抱歉,只是注意到你不是在谈论Workbooks )…

 public interface Worksheet : _Worksheet, DocEvents_Event 

DocEvents_Event

 [ComVisible(false), TypeLibType((short) 0x10), ComEventInterface(typeof(DocEvents), typeof(DocEvents_EventProvider))] public interface DocEvents_Event { // Events event DocEvents_ActivateEventHandler Activate; event DocEvents_BeforeDoubleClickEventHandler BeforeDoubleClick; event DocEvents_BeforeRightClickEventHandler BeforeRightClick; event DocEvents_CalculateEventHandler Calculate; event DocEvents_ChangeEventHandler Change; event DocEvents_DeactivateEventHandler Deactivate; event DocEvents_FollowHyperlinkEventHandler FollowHyperlink; event DocEvents_PivotTableUpdateEventHandler PivotTableUpdate; event DocEvents_SelectionChangeEventHandler SelectionChange; } 

我会说最好是使用Worksheet ,但这是不同的。

类和接口仅供内部使用

避免直接使用以下任何类别和接口,它们在内部使用,通常不直接使用。

类/接口: 例子

classid类: ApplicationClass(Word或Excel),WorksheetClass(Excel)

classid事件x _SinkHelper: ApplicationEvents4_SinkHelper(Word),WorkbookEvents_SinkHelper(Excel)

_classid_Application(Word或Excel),_Worksheet(Excel)

classid事件x: ApplicationEvents4(Word),AppEvents(Excel)

classid事件x: IApplicationEvents4(Word),IAppEvents(Excel)

http://msdn.microsoft.com/en-gb/library/ms247299(office.11​​).aspx

编辑:(重新:这个答案的格式)不能正确格式化一个转义的下划线后立即斜体文本。 在预览中正确显示,但在发布时会中断

编辑2:作品,如果你使下划线本身斜体,这在概念上是可怕的,但看起来是相同的,我想

在过去的几年中,我已经看到和写了不lessC#/ Excel COM Interop代码,而且几乎在每种情况下都使用过Worksheet。 我从来没有见过微软在这个问题上的任何权威。

MSDN显示Worksheet接口只是从_WorksheetDocEvents_Event接口inheritance。 看起来似乎只是提供了一个工作表对象可能引发的事件。 据我所知, Worksheet并没有提供任何其他的成员。 所以,不妨在所有情况下使用Worksheet接口,因为它不会丢失任何东西,并且可能需要它公开的事件。