74 votes

Interop Excel: _Worksheet ou Worksheet?

Je suis en train d'écrire à propos de typage dynamique, et je suis en train de donner un exemple d'Excel interop. J'ai à peine fait Office interop avant, et il montre. La MSDN Bureau Interop tutoriel pour C# 4 _Worksheet interface, mais il y a aussi un Worksheet interface. Je n'ai aucune idée de ce qu'est la différence.

Dans mon absurdement simple démo d'application (voir ci-dessous) fonctionne très bien - mais si les meilleures pratiques montrent l'un ou l'autre, je préfère l'utiliser de façon appropriée.

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

J'essaie d'éviter de faire un plein plongée dans COM ou au Bureau de l'interopérabilité, tout en soulignant les nouvelles fonctionnalités de C# 4 - mais je ne veux pas faire quelque chose de vraiment, vraiment stupide.

(Il y a peut être quelque chose de vraiment, vraiment stupide dans le code ci-dessus, auquel cas, s'il vous plaît laissez-moi savoir. À l'aide d'une start/end cellules au lieu de simplement "A1:T1" est délibéré: il est plus facile de voir que c'est véritablement une gamme de 20 cellules. Tout le reste est probablement accidentelle.)

Donc, dois-je utiliser _Worksheet ou Worksheet, et pourquoi?

77voto

Eric Lippert Points 300275

Si je me souviens bien-et mon mémoire sur ce qui est un peu floue, il a été un long temps depuis que j'ai pris le Excel PIA d'intervalle, c'est comme ça.

Un événement est essentiellement une méthode d'un objet appelle quand il se passe quelque chose. Dans .NET, les événements sont délégués, pure et simple. Mais dans la COM, il est très commun pour organiser tout un tas de rappels d'événements dans les interfaces. Vous avez donc deux interfaces sur un objet donné -- les "entrants" de l'interface, les méthodes que vous attendez d'autres personnes à faire appel à vous, et les "sortants" de l'interface, les méthodes que vous attendez pour appeler d'autres personnes lorsque des événements se produisent.

Dans le non géré métadonnées -- la bibliothèque de type, pour un creatable objet il y a des définitions de ces trois choses: l'interface entrante, l'interface sortante, et la coclasse, qui dit "je suis un creatable objet qui implémente cette interface d'entrée et de cette interface de sortie".

Maintenant, quand la bibliothèque de type est automatiquement traduit dans les métadonnées, ces relations sont, malheureusement, préservé. Il aurait été plus agréable d'avoir une main-généré PIA qui a fait les classes et les interfaces sont conformes à ce que nous attendons dans le monde géré, mais malheureusement, ce n'est pas arrivé. Par conséquent, l'Office PIA est pleine de ces apparemment étrange, duplications, où chaque creatable objet semble avoir deux interfaces sont associés, avec le même genre de choses sur eux. L'une des interfaces représente l'interface de la coclasse, et l'un d'eux représente l'interface d'entrée pour que la coclasse.

Le _Workbook interface est l'interface d'entrée sur le classeur de la coclasse. Le Classeur de l'interface est l'interface qui représente la coclasse lui-même, et hérite donc de _Workbook.

Longue histoire courte, je voudrais utiliser le Classeur si vous pouvez le faire facilement; _Workbook est un peu un détail d'implémentation.

25voto

JP Alioto Points 33482

Si vous regardez le PIA assemblée (Microsoft.Bureau de.Interop.Excel) Reflector, Workbook interface a cette définition ...

public interface Workbook : _Workbook, WorkbookEvents_Event

Workbook est _Workbook mais ajoute des événements. De même pour Worksheet (désolé, juste remarqué que vous ne parlons pas d' 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;
}

Je dirais que c'est mieux d'utiliser Worksheet, mais c'est toute la différence.

8voto

barrowc Points 4515

Classes et Interfaces pour les Internes Utilisez Uniquement Des

Éviter d'utiliser directement l'un de l' suivant les classes et les interfaces, qui sont utilisés à l'interne et pas utilisé directement.

Classe/Interface : Exemples

identificateur de classe de la Classe : ApplicationClass (Word ou Excel), WorksheetClass (Excel)

classid Événements x _SinkHelper : ApplicationEvents4_SinkHelper (Word), WorkbookEvents_SinkHelper (Excel)

_classid : _Application (Word ou Excel), _Worksheet (Excel)

classid Événements x : ApplicationEvents4 (Word), AppEvents (Excel)

Je classid les Événements de x : IApplicationEvents4 (Word), IAppEvents (Excel)

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

edit: (re: mise en forme de cette réponse) ne peut pas formater correctement une fuite de souligner immédiatement suivie par un texte en italique. Affiche correctement dans l'aperçu, mais cassé lors de posté

edit2: si vous faites le trait de soulignement elle-même italique qui est conceptuellement horrible, mais regarde la même chose je suppose

7voto

Joe Erickson Points 4571

J'ai vu et écrit pas mal de code C # / Excel COM Interop au cours de ces dernières années et j'ai vu la feuille de calcul utilisée dans presque tous les cas. Je n'ai jamais rien vu de concret de Microsoft sur le sujet.

6voto

Noldorin Points 67794

MSDN montre que l' Worksheet simplement l'interface hérite de la _Worksheet et DocEvents_Event interfaces. Il semblerait que l'on fournit simplement les événements d'un objet de feuille de calcul pourrait soulever en plus de tout le reste. Aussi loin que je peux voir, Worksheet ne fournit pas les autres membres de son propre. Si oui, vous pourriez tout aussi bien aller avec l'aide de l' Worksheet interface dans tous les cas, puisque vous ne perdez rien en elle, et, potentiellement, pourraient avoir besoin les événements qu'il expose.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X