Excel 互操作:_工作表还是工作表?

我目前正在写有关动态类型的文章,并且给出了一个 Excel 互操作的示例。我几乎没有做过任何办公室互操作,它显示。用于 C # 4的 MSDN Office 互操作教程使用 _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,为什么?

24959 次浏览

在过去的几年里,我看到并编写了大量的 C #/Excel COM 互操作代码,而且几乎在每种情况下都使用了工作表。在这个问题上,我从来没有看到任何来自微软的决定性的东西。

MSDN 显示,Worksheet接口只是继承自 _WorksheetDocEvents_Event接口。似乎只是提供工作表对象可能引发的事件以及其他所有事件。据我所知,Worksheet没有提供它自己的任何其他成员。因此,在所有情况下都可以使用 Worksheet接口,因为它不会造成任何损失,并且可能需要它公开的事件。

如果查看 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是最好的选择,但这就是区别所在。

如果我没记错的话,我对这个的记忆有点模糊,我已经很久没有拆开 Excel PIA 了,是这样的。

事件本质上是对象在发生某些事情时调用的方法。进去。NET 中,事件是委托,简单明了。但是在 COM 中,将一大堆事件回调组织到接口中是很常见的。因此,在一个给定的对象上有两个接口——“传入”接口、期望其他人调用的方法和“传出”接口,在事件发生时期望其他人调用的方法。

在非托管元数据(类型库)中,可创建对象有三个定义: 传入接口、传出接口和 coclass,coclass 表示“我是一个可创建对象,实现这个传入接口和这个传出接口”。

现在,当类型库被自动转换成元数据时,这些关系很遗憾地被保留了下来。如果有一个手工生成的 PIA,使类和接口更符合我们在托管世界中所期望的,那会更好,但遗憾的是,这并没有发生。因此,Office PIA 充满了这些看似奇怪的重复,其中每个可创建对象似乎都有两个与之关联的接口,上面有相同的内容。其中一个接口表示辅助类的接口,其中一个接口表示该辅助类的传入接口。

_ Workbook 接口是工作簿辅助类上的传入接口。Workbook 接口是表示 coclass 本身的接口,因此从 _ Workbook 继承。

长话短说,如果方便的话,我会使用 Workbook; _ Workbook 是一个实现细节。

内部的类和接口 仅使用

避免直接使用 接下来的类和接口, 内部使用 通常不直接使用。

类/接口: 例子

类别 类别: < em > 应用类别 (Word 或 Excel) ,工作表类 (Excel)

类别 活动 x _ SinkHelper: ApplicationEvents4 _ SinkHelper (Word)、 WorkbookEvents _ SinkHelper (Excel)

_ classd : < em > _ Application (Word 或 Excel) ,_ Worksheet (Excel)

分类 活动 x: < em > 应用程序活动4 (Word) ,AppEvents (Excel)

I 经典比赛项目 x: IApplicationEvents4(Word)、 IAppEvents (Excel)

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

编辑: (重新格式化此答案)无法正确格式化转义下划线后紧跟斜体文本。在预览中显示正确,但在发布时中断

如果你让下划线本身变成斜体,就可以工作,这在概念上很糟糕,但是我认为它们看起来是一样的