Excel interop: _Worksheet ou une Feuille de calcul?
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. Le MSDN Bureau Interop tutoriel pour C# 4 utilise le _Worksheet
de l'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), soit 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 ainsi, dans ce 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?
- Jon, en plus de l'excellent réponses données ici, je voudrais ajouter que, en général, lorsque vous travaillez avec Excel par le biais de l'interopérabilité, utiliser le nom de la classe comme elle apparaît normalement dans Excel. Cela signifie utiliser la "Feuille de calcul" au lieu de "_Worksheet', et d'utiliser l '"Application" au lieu de "ApplicationClass'. (Une discussion ici explique pourquoi ne pas utiliser les ApplicationClass': blogs.msdn.com/ptorr/archive/2004/02/05/67872.aspx.) Si vous n'êtes pas familier avec le modèle objet d'Excel est exposé à COM, alors que cela pourrait être plus compliqué, mais je pense qu'il devrait être assez clair la plupart du temps.
- Heureusement, je fais très peu, avec des bureaux, vraiment juste en essayant de montrer les nouvelles fonctionnalités. Merci beaucoup pour le lien si - très utile!
- Je suis désolé, mais ont à poser - Quelle est la nouvelle fonctionnalité de C# 4 que vous mettez en surbrillance?
- Pour ce cas particulier, il a été typage dynamique - les types de retour différents appels de méthode/propriétés sont en fait des "dynamique", d'où le manque de jette qui serait autrement nécessaire.
Vous devez vous connecter pour publier un commentaire.
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 sortante".
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.
La _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.
Si vous regardez le PIA assemblée (Microsoft.Bureau de.Interop.Excel) dans
Réflecteur
, leWorkbook
interface a cette définition ...Workbook
est_Workbook
mais ajoute des événements. De même pourWorksheet
(désolé, juste remarqué que vous ne parlons pas d'Workbooks
) ...DocEvents_Event
...Je dirais que c'est mieux d'utiliser
Worksheet
, mais c'est la différence.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 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
J'ai vu et écrit tout à fait un peu de C# /Excel COM Interop code au cours de la dernière quelques années, et j'ai vu de la Feuille de calcul utilisé dans presque tous les cas. Je n'ai jamais vu quelque chose de définitif à partir de Microsoft sur le sujet.
MSDN montre que la
Feuille
simplement l'interface hérite de la_Worksheet
etDocEvents_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 laWorksheet
interface dans tous les cas, puisque vous ne perdez rien en elle, et, potentiellement, pourraient avoir besoin les événements qu'il expose.