現在、動的型付けについて書いており、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
を使用する必要がありますか?
正しく思い出すと、これに関する記憶が少し曖昧になりますが、Excel PIAを分解してから長い時間が経ちましたが、このようになっています。
イベントは、本質的に何かが発生したときにオブジェクトが呼び出すメソッドです。 .NETでは、イベントはデリゲートであり、単純で単純です。しかし、COMでは、多数のイベントコールバックをインターフェイスに整理することが非常に一般的です。したがって、特定のオブジェクトに2つのインターフェイスがあります。「着信」インターフェイス、他の人があなたに呼び出すことを期待するメソッド、および「発信」インターフェイス、イベントが発生したときに他の人に呼び出すことを期待するメソッドです。
アンマネージメタデータ(タイプライブラリ)には、作成可能なオブジェクトの定義が3つあります。着信インターフェイス、発信インターフェイス、およびコクラスです。「この着信インターフェイスとこれを実装する作成可能なオブジェクトです。発信インターフェイス」。
タイプライブラリがメタデータに自動的に変換されると、悲しいことに、それらの関係は保持されます。マネージドワールドで期待されるものにクラスとインターフェイスをより適合させる手作りのPIAがあればよかったのですが、残念ながらそれは起こりませんでした。そのため、Office PIAは、一見奇妙に見える重複でいっぱいです。すべての作成可能なオブジェクトには、同じものが関連付けられた2つのインターフェイスが関連付けられているようです。インターフェイスの1つはコクラスへのインターフェイスを表し、それらの1つはそのコクラスへの着信インターフェイスを表します。
_Workbookインターフェイスは、ワークブックコクラスの着信インターフェイスです。 Workbookインターフェースは、コクラス自体を表すインターフェースであるため、_Workbookから継承します。
簡単に言えば、もしそうすることができればWorkbookを使用します。 _Workbookは、実装の詳細です。
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
を使用するのが最善の策だと思いますが、それは違いです。
内部使用専用のクラスとインターフェース
内部で使用され、通常は直接使用されない次のクラスおよびインターフェイスを直接使用しないでください。
クラス/インターフェース:例
classidClass:ApplicationClass(WordまたはExcel)、WorksheetClass(Excel)
classidイベントx _SinkHelper:ApplicationEvents4_SinkHelper(Word)、WorkbookEvents_SinkHelper(Excel)
_ classid:_ Application(WordまたはExcel)、_ Worksheet(Excel)
classidEvents x:ApplicationEvents4(Word)、AppEvents(Excel)
I classid Events x : IApplicationEvents4 (Word), IAppEvents (Excel)
http://msdn.Microsoft.com/en-gb/library/ms247299(office.11).aspx
edit:(re:この回答のフォーマット)エスケープされたアンダースコアの直後に斜体のテキストが続くフォーマットは正しくできません。プレビューでは正しく表示されますが、投稿時に破損します
edit2:アンダースコア自体を斜体にする場合に機能します。これは概念的に恐ろしいですが、同じように見えます
過去数年にわたってかなりの数のC#/ Excel COM相互運用コードを見てきましたが、ほぼすべてのケースでWorksheetが使用されています。この件に関してマイクロソフトから決定的なものを見たことはありません。
MSDNは、 Worksheet
インターフェイスが _Worksheet
および DocEvents_Event
インターフェイス。ワークシートオブジェクトが他のすべてに加えて発生させる可能性のあるイベントを単に提供するように思われます。私が見る限り、Worksheet
は独自のメンバーを提供していません。そのため、すべての場合でWorksheet
インターフェイスを使用するだけで済みます。何も失わないため、公開するイベントが必要になる可能性があるためです。