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
接口只是从_Worksheet
和DocEvents_Event
接口inheritance。 似乎只是简单地提供了一个工作表对象可能引发的事件。 据我所知, Worksheet
并没有提供任何其他的成员。 所以,不妨在所有情况下使用Worksheet
接口,因为它不会丢失任何东西,并且可能需要它公开的事件。