[英]Excel interop: _Worksheet or Worksheet?
我目前正在写有关动态类型的文章,并以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的新功能-但我不想做任何真正非常愚蠢的事情。
(上面的代码中可能还会有一些非常愚蠢的东西,在这种情况下,请告诉我。故意使用单独的开始/结束单元格而不是仅使用“ A1:T1”-更容易看出它确实是一个范围20个单元格。其他任何事情都可能是偶然的。)
因此,我应该使用_Worksheet
还是Worksheet
,为什么?
如果我没记错-我对此的记忆有点模糊,那么自从我将Excel PIA分开以来已经很长时间了-就是这样。
事件本质上是某种事件发生时对象调用的方法。 在.NET中,事件是简单且简单的委托。 但是在COM中,将大量事件回调组织到接口中是很常见的。 因此,您在给定对象上有两个接口-“传入”接口(您希望其他人调用的方法)和“传出”接口(您希望在事件发生时调用其他人的方法)。
在非托管元数据(类型库)中,对于可创建对象,有以下三项定义:传入接口,传出接口和coclass,它表示“我是实现此传入接口和该对象的可创建对象。传出接口”。
现在,当类型库自动转换为元数据时,很遗憾地保留了这些关系。 拥有一个手工生成的PIA来使类和接口更符合我们在托管环境中的期望会更好,但是遗憾的是那没有发生。 因此,Office PIA充满了这些看似奇怪的重复项,其中每个可创建对象似乎都具有与其关联的两个接口,并且它们上具有相同的内容。 其中一个接口表示该类的接口,而其中一个表示该类的传入接口。
_Workbook接口是工作簿coclass上的传入接口。 Workbook接口是代表coclass本身的接口,因此是从_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)
I classid事件x: IApplicationEvents4(Word),IAppEvents(Excel)
http://msdn.microsoft.com/zh-CN/library/ms247299(office.11).aspx
编辑:(re:此答案的格式)无法正确设置转义的下划线,然后立即加上斜体文本。 在预览中正确显示,但在发布时损坏
edit2:如果您将下划线本身设置为斜体,则该方法在概念上是可怕的,但我认为应该与之相同
在过去的几年中,我已经看到并编写了很多C#/ Excel COM Interop代码,而且我已经看到了几乎在每种情况下都使用了工作表。 我从未见过Microsoft对此主题做出任何明确的决定。
MSDN显示, Worksheet
接口仅继承自_Worksheet
和DocEvents_Event
接口。 似乎只是提供了工作表对象可能会引发的其他事件。 据我所知, Worksheet
未提供其自身的任何其他成员。 是的,您最好还是在所有情况下都使用Worksheet
界面,因为它不会丢失任何东西,并且可能需要它公开的事件。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.