我目前正在写一篇关于动态类型的文章,我给出了一个Excel互操作的例子。我以前几乎没有做过任何Office互操作,它显示了。C# 4的MSDN Office Interop tutorial使用_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
?为什么?
发布于 2009-06-26 22:26:03
如果我没记错的话--我的记忆有点模糊,自从我拆开Excel PIA已经有很长一段时间了--是这样的。
事件本质上是对象在发生某些事情时调用的方法。在.NET中,事件是简单明了的委托。但在COM中,将一大堆事件回调组织到接口中是很常见的。因此,在给定对象上有两个接口--“传入”接口,即您希望其他人调用您的方法,以及“传出”接口,当事件发生时,您希望调用其他人调用的方法。
在可创建对象的非托管元数据(类型库)中,有三种定义:传入接口、传出接口和coclass,coclass表示“我是一个实现传入接口和传出接口的可创建对象”。
现在,当类型库自动转换为元数据时,这些关系将被保留下来。如果有一个手工生成的PIA,让类和接口更符合我们在托管世界中的期望,那会更好,但遗憾的是,这并没有发生。因此,Office PIA充满了这些看似奇怪的重复,其中每个可创建的对象似乎都有两个与其关联的接口,在它们上面有相同的东西。其中一个接口表示coclass的接口,另一个接口表示该coclass的传入接口。
_Workbook接口是工作簿coclass上的传入接口。工作簿接口是表示coclass本身的接口,因此继承自_Workbook。
长话短说,如果您可以方便地使用工作簿,我会使用工作簿;_Workbook是一个实现细节。
发布于 2009-06-26 22:22:03
如果您查看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
,但这就是不同之处。
发布于 2009-06-26 22:07:57
在过去的几年里,我看到并编写了相当多的C# / Excel COM Interop代码,我几乎在所有情况下都看到使用工作表。我从来没有见过微软在这个问题上有任何明确的东西。
https://stackoverflow.com/questions/1051464
复制相似问题