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

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (26)

我目前正在撰写关于动态输入的文章,并给出了Excel互操作的一个示例。我以前几乎没有做过任何Office互操作,它显示了。

在我荒谬而简单的演示应用程序(如下图所示)中,要么工作正常--但如果最佳实践决定了其中一个,我宁愿适当地使用它。

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”是故意的-它更容易看到它是一个真正的范围。其他任何事情都可能是偶然的。)

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

提问于
用户回答回答于

如果我没记错的话--我对这件事的记忆有点模糊,我很久没有把Excel PIA拆开--是这样的。

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

在非托管元数据中--类型库--对于一个可创建的对象,有三种定义:传入接口、传出接口和coclass,其中写着“I是一个可创建的对象,实现了这个传入接口和这个传出接口”。

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

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

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

用户回答回答于

中的PIA程序集(Microsoft.Office.Interop.Excel)ReflectorWorkbook接口有这个定义。

public interface Workbook : _Workbook, WorkbookEvents_Event

Workbook_Workbook但是增加了一些事件。同为Worksheet

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但这就是区别。

扫码关注云+社区