首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Excel互操作:_Worksheet还是Worksheet?

Excel互操作:_Worksheet还是Worksheet?
EN

Stack Overflow用户
提问于 2009-06-26 22:02:32
回答 4查看 24.6K关注 0票数 79

我目前正在写一篇关于动态类型的文章,我给出了一个Excel互操作的例子。我以前几乎没有做过任何Office互操作,它显示了。C# 4的MSDN Office Interop tutorial使用_Worksheet接口,但也有一个Worksheet接口。我不知道有什么不同。

在我的简单得离谱的演示应用程序中(如下所示),要么工作得很好--但如果最佳实践规定了其中之一,我宁愿适当地使用它。

代码语言:javascript
复制
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?为什么?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2009-06-26 22:26:03

如果我没记错的话--我的记忆有点模糊,自从我拆开Excel PIA已经有很长一段时间了--是这样的。

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

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

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

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

长话短说,如果您可以方便地使用工作簿,我会使用工作簿;_Workbook是一个实现细节。

票数 77
EN

Stack Overflow用户

发布于 2009-06-26 22:22:03

如果您查看Reflector中的PIA程序集(Microsoft.Office.Interop.Excel),Workbook接口具有以下定义...

代码语言:javascript
复制
public interface Workbook : _Workbook, WorkbookEvents_Event

Workbook_Workbook,但添加了事件。Worksheet也是如此(对不起,我只是注意到你说的不是Workbooks)……

代码语言:javascript
复制
public interface Worksheet : _Worksheet, DocEvents_Event

DocEvents_Event ...

代码语言:javascript
复制
[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,但这就是不同之处。

票数 25
EN

Stack Overflow用户

发布于 2009-06-26 22:07:57

在过去的几年里,我看到并编写了相当多的C# / Excel COM Interop代码,我几乎在所有情况下都看到使用工作表。我从来没有见过微软在这个问题上有任何明确的东西。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1051464

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档