Excel互操作:_Worksheet还是Worksheet?


76

我目前正在写有关动态类型的文章,并举例说明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,为什么呢?


5
乔恩(Jon),除了在此处给出出色的答案外,我还要补充一点,通常在通过互操作使用Excel时,请使用通常在Excel中出现的类名。这意味着使用“工作表”而不是“ _Worksheet”,并使用“应用程序”而不是“ ApplicationClass”。(这里的讨论解释了为什么不使用'ApplicationClass':blogs.msdn.com/ptorr/archive/2004/02/05/67872.aspx。)如果您不熟悉暴露于COM的Excel对象模型,那么这可能会比较棘手,但是我认为大多数时候都应该很清楚。
Mike Rosenblum

幸运的是我做的非常小的Office -真的只是想展示的新功能。非常感谢您提供的链接-非常有帮助!
乔恩·斯基特

抱歉,我不得不问-您要强调的C#4的新功能是什么?
奥斯卡

对于这种特殊情况,它是动态类型的-各种方法调用/属性的返回类型实际上是“动态的”,因此缺少强制转换。
乔恩·斯基特

Answers:


77

如果我没记错-我对此的记忆有点模糊,那么自从我将Excel PIA分开以来已经很长时间了-就是这样。

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

在非托管元数据(类型库)中,对于可创建对象,有以下三项定义:传入接口,传出接口和coclass,它表示“我是实现此传入接口和该对象的可创建对象。传出接口”。

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

_Workbook接口是工作簿coclass上的传入接口。Workbook接口是代表coclass本身的接口,因此是从_Workbook继承的。

长话短说,如果您方便的话,我会使用Workbook。_Workbook有点实现细节。


我们在这里谈论的是Worksheet / _Worksheet ...您读错了与JP相同的错误,但正如他指出的,情况基本上是相同的。;)
Noldorin

25

如果您在中查看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,但这就是区别。


8

仅供内部使用的类和接口

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

类/接口:示例

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:如果您将下划线本身设置为斜体,则该方法在概念上是可怕的,但我认为应该与之相同


7

在过去的几年中,我已经看到并编写了很多C#/ Excel COM Interop代码,而且我已经看到了几乎在每种情况下都使用过Worksheet。我从未见过Microsoft对此主题做出任何明确的决定。


谢谢。出于兴趣,您是否一直在跟上C#4的改进?他们听起来好像在Office互操作方面会产生很大的变化,但是如果没有经验,我真的只是在猜测(在撰写本书时,还是虚张声势……)
Jon Skeet

当必须使用COM时,动态/ COM Interop的改进看起来很有用,但我敢肯定,我将不仅仅使用动态功能。我真正期待的是C#4 / .NET 4中的代码契约和Task Parallel Library。
乔·埃里克森

6

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


4
乔恩·斯基特(Jon Skeet)一个问题??我不得不采取这种难得的机会来回应!:)
Noldorin

(此外,我可能只是选择使用工作表,因为那里的下划线看起来非常丑陋……但说真的,似乎没有理由不这样做。)
Noldorin 2009年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.