80 Stimmen

Excel interop: _Worksheet oder Worksheet?

Ich schreibe gerade über dynamische Typisierung und gebe ein Beispiel für Excel-Interop. Ich habe mich bisher kaum mit Office-Interop beschäftigt, und das merkt man. Die MSDN Office Interop-Tutorial für C# 4 verwendet die _Worksheet Schnittstelle, aber es gibt auch eine Worksheet Schnittstelle. Ich habe keine Ahnung, worin der Unterschied besteht.

In meiner absurd einfachen Demo-Anwendung (siehe unten) funktioniert beides gut - aber wenn die beste Praxis das eine oder das andere vorschreibt, würde ich es lieber entsprechend verwenden.

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();
    }
}

Ich versuche es zu vermeiden, eine vollständige Vertiefung in COM oder Office-Interoperabilität zu machen und nur die neuen Funktionen von C# 4 hervorzuheben - aber ich möchte nichts wirklich Dummes machen.

(Es kann sein, dass auch im obigen Code etwas sehr, sehr dumm ist; in diesem Fall lassen Sie es mich bitte wissen. Die Verwendung von separaten Start-/Endzellen anstelle von "A1:T1" ist beabsichtigt - es ist leichter zu erkennen, dass es sich wirklich um einen Bereich von 20 Zellen handelt. Alles andere ist wahrscheinlich ein Versehen).

Sollte ich also Folgendes verwenden _Worksheet o Worksheet und warum?

77voto

Eric Lippert Punkte 628543

Wenn ich mich richtig erinnere - und mein Gedächtnis ist etwas verschwommen, da es lange her ist, dass ich die Excel-PIA auseinandergenommen habe -, sieht das so aus.

Ein Ereignis ist im Wesentlichen eine Methode, die ein Objekt aufruft, wenn etwas passiert. In .NET sind Ereignisse Delegierte, schlicht und einfach. Aber in COM ist es sehr üblich, eine ganze Reihe von Ereignisaufrufen in Schnittstellen zu organisieren. Sie haben daher zwei Schnittstellen für ein bestimmtes Objekt - die "eingehende" Schnittstelle, die Methoden, die Sie erwarten, dass andere Personen Sie aufrufen, und die "ausgehende" Schnittstelle, die Methoden, die Sie erwarten, dass Sie andere Personen aufrufen, wenn Ereignisse eintreten.

In den nicht verwalteten Metadaten - der Typbibliothek - für ein erzeugbares Objekt gibt es Definitionen für drei Dinge: die eingehende Schnittstelle, die ausgehende Schnittstelle und die Koklasse, die besagt: "Ich bin ein erzeugbares Objekt, das diese eingehende Schnittstelle und diese ausgehende Schnittstelle implementiert".

Wenn nun die Typbibliothek automatisch in Metadaten übersetzt wird, bleiben diese Beziehungen leider erhalten. Es wäre schöner gewesen, ein von Hand generiertes PIA zu haben, das die Klassen und Schnittstellen mehr an das anpasst, was wir in der verwalteten Welt erwarten würden, aber leider ist das nicht geschehen. Daher ist das Office PIA voll von diesen seltsam anmutenden Duplikationen, bei denen jedes erstellbare Objekt zwei Schnittstellen zu haben scheint, die denselben Inhalt haben. Eine der Schnittstellen stellt die Schnittstelle zur Coklasse dar, und eine der Schnittstellen stellt die Eingangsschnittstelle zu dieser Coklasse dar.

Die Schnittstelle _Workbook ist die Eingangsschnittstelle der Workbook-Coclass. Die Schnittstelle Workbook ist die Schnittstelle, die die Koklasse selbst darstellt, und erbt daher von _Workbook.

Langer Rede kurzer Sinn, ich würde Workbook verwenden, wenn Sie so bequem tun können; _Workbook ist ein bisschen ein Detail der Implementierung.

25voto

JP Alioto Punkte 44283

Wenn Sie sich die PIA-Assembly (Microsoft.Office.Interop.Excel) in Reflector die Workbook Schnittstelle hat diese Definition ...

public interface Workbook : _Workbook, WorkbookEvents_Event

Workbook es _Workbook sondern fügt Ereignisse hinzu. Dasselbe gilt für Worksheet (Entschuldigung, ich habe gerade bemerkt, dass Sie nicht über 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;
}

Ich würde sagen, dass es am besten ist, die Worksheet aber das ist der Unterschied.

8voto

barrowc Punkte 10041

Klassen und Interfaces für interne Verwendung

Vermeiden Sie die direkte Verwendung eines der folgenden Klassen und Schnittstellen, die intern verwendet werden und normalerweise nicht direkt verwendet werden.

Klasse/Schnittstelle : Beispiele

classid Klasse : ApplicationClass (Word oder Excel), WorksheetClass (Excel)

classid Ereignisse x _SinkHelper : ApplicationEvents4_SinkHelper (Word), WorkbookEvents_SinkHelper (Excel)

_classid : Anwendung (Word oder Excel), _Arbeitsblatt (Excel)

classid Ereignisse x : AnwendungsEreignisse4 (Word), AppEvents (Excel)

I classid Ereignisse x : IApplicationEvents4 (Word), IAppEvents (Excel)

http://msdn.microsoft.com/en-gb/library/ms247299(office.11).aspx

edit: (re: Formatierung dieser Antwort) kann einen Unterstrich nicht korrekt formatieren, der sofort von kursivem Text gefolgt wird. Wird in der Vorschau korrekt angezeigt, ist aber beim Posten defekt

edit2: funktioniert, wenn man den Unterstrich selbst kursiv macht, was konzeptionell furchtbar ist, aber wohl genauso aussieht

7voto

Joe Erickson Punkte 6899

Ich habe gesehen und geschrieben ziemlich viel C# / Excel COM Interop-Code in den letzten Jahren und ich habe gesehen, Worksheet in fast jedem Fall verwendet. Ich habe nie etwas Definitives von Microsoft zu diesem Thema gesehen.

6voto

Noldorin Punkte 138548

MSDN zeigt, dass die Worksheet Schnittstelle erbt einfach von der _Worksheet y DocEvents_Event Schnittstellen. Es scheint, dass man einfach die Ereignisse bereitstellt, die ein Arbeitsblattobjekt zusätzlich zu allem anderen auslösen könnte. Soweit ich das sehen kann, Worksheet stellt keine weiteren eigenen Mitglieder zur Verfügung. Sie können also genauso gut einfach die Worksheet Schnittstelle in allen Fällen, da Sie dadurch nichts verlieren und möglicherweise die Ereignisse benötigen, die sie offenlegt.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X