Excel的互操作:_Worksheet或工作表?Excel的互操作:_Worksheet或工作表?

2019-05-13 23:19发布

我目前正在写关于动态类型,和我给Excel的互操作的一个例子。 我几乎没有做过任何Office互操作,并且它显示。 在MSDN办公室互操作教程为C#4使用_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个细胞的,还有什么可能是偶然的。)

所以,我应该使用_WorksheetWorksheet ,为什么?

Answer 1:

如果我没有记错 - 我对这个记忆有点模糊,它已经很长一段时间,因为我带着了Excel PIA分开 - 是这样的。

事件本质上是有事情发生时,一个对象调用的方法。 在.NET中,事件是代表,简单明了。 但在COM,这是很常见的一大堆事件的回调整理成接口。 因此,你有一个给定对象的两个接口 - “接收”界面,你还指望别人给你打电话的方式,而“走出去”的界面,你希望别人打电话的时候发生的事件的方法。

在非托管元数据 - 类型库 - 一个可创建对象有三件事定义:输入接口,输出接口和组件类,它说:“我实现了这个入接口和这个可创建对象输出接口”。

现在,当类型库自动转换成元数据,这些关系,可悲的是,保存完好。 这本来是更好的有一个手工生成的PIA是由类和接口更符合我们会在管理世界期待,但可悲的是,这种情况并未发生。 因此,办公室PIA充满这些看似奇怪的重复,其中每一个可创建对象似乎有与之相关联,与他们同样的东西,两个接口。 接口之一表示接口至共类,以及它们中的一个表示的入接口到该共类。

该_Workbook接口是在工作簿组件类的入接口。 工作簿接口是代表共类本身,因此从_Workbook继承的接口。

长话短说,我会用工作簿,如果你能这样做方便; _Workbook有点一个实现细节的。



Answer 2:

如果你看一下在PIA组件(的Microsoft.Office.Interop.Excel) Reflector ,该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 ,但是这就是区别。



Answer 3:

类和接口仅供内部使用

避免直接使用以下任一类和接口,它们在内部使用,并且通常不直接使用的。

类/接口: 实施例

的classid类别:ApplicationClass(Word或Excel),WorksheetClass(Excel)中

CLASSID活动X _SinkHelper:ApplicationEvents4_SinkHelper(字),WorkbookEvents_SinkHelper(EXCEL)

_classid:_Application(Word或Excel),_Worksheet(EXCEL)

CLASSID活动X:ApplicationEvents4(字),AppEvents(EXCEL)

的classid活动X:IApplicationEvents4(字),IAppEvents(EXCEL)

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

编辑:(RE:这个答案的格式),不能正确格式化转义下划线紧接着斜体文字。 正确地显示在预览,但发布时坏

EDIT2:工作,如果你让下划线本身斜体在概念上是可怕的,但看起来是一样的,我想



Answer 4:

我所看到的和书面相当多的C#/ Excel的COM互操作代码,在过去的几年中,我已经看到工作表中使用的几乎所有情况下。 我从来没有看到关于这个问题的任何微软明确。



Answer 5:

MSDN表明, Worksheet界面简单地从继承_WorksheetDocEvents_Event接口。 这似乎是一个简单的提供了一个工作表对象可能会额外提高到一切的事件。 据我所看到的, Worksheet不提供任何自己的其他成员。 所以,是的,你可能也只是去与使用Worksheet界面在所有情况下,因为你不要被它失去什么,以及潜在可能需要它公开的事件。



文章来源: Excel interop: _Worksheet or Worksheet?