es   fr   de  

Software-Conférences Lefthand Software-Wydawnictwo


E-mail:
                               

Automation


Piloter Office depuis une application .NET

Microsoft Office est la suite bureautique la plus utilisée et la plus connue dans le monde. Son ergonomie, sa facilité d’utilisation, et ses fonctionnalités l’ont rendue célèbre voire universelle. En tant que développeur, nous sommes rapidement confrontés à la nécessité de piloter, d’intégrer, ou de générer des documents Office.

Cet article explique :
  • L’automation Office par l’intermédiaire d’une application manipulant PowerPoint et Word.
  • La technologie COM.
Ce qu'il faut savoir :
  • Connaissance du langage C# à un niveau moyen ou avancé.
  • Utilisation avancée de Word et de PowerPoint.


A l’aube de la sortie d’Office 2007, il peut être intéressant de faire le point sur les techniques, et les technologies existantes pour manipuler les documents Office. Lorsqu’on aborde pour la première fois la plateforme de développement pour Office, l’exhaustivité des techniques est au premier abord déroutant. Pour simplifier, on distingue :

  • l’automatisation des applications Office dans d’autres programmes (en anglais Office external automation) : des applications extérieures pilotent les applications Office. Les applications Office sont des serveurs COM permettant à des applications extérieures de communiquer avec elles ;
  • l’extension des applications Office utilisées comme frontal . (In Process Automation) : on étend les fonctionnalités directement depuis l’application Office. On peut utiliser le langage de script VBA intégré à la suite office ou encore utiliser un outil dédié à l’intégration de code .net dans Office, Visual Studio Tool for Office (pour l’instant, l’outil est limité à Microsoft Word, Excel, et Outlook) ;
  • plus des techniques de manipulation et de reconnaissance des données (SmartTags, SmartDocuments, etc…), et Services Web.
Dans cet article, nous discuterons de l’automatisation des applications Office 2003 depuis des programmes réalisés en C#. Nous prendrons l’environnement de développement Visual Studio 2005, dont vous pouvez vous procurez une version Express sur le site de Microsoft. Pour se faire, nous allons développer ensemble une petite application peu ordinaire, un générateur de diapositives PowerPoint. L’application pourra diffuser aléatoirement les diapositives au cours du diaporama, et permet l’exportation d’un petit rapport sur Word des contenus des diapositives créées. Tout un programme ! Vous le trouverez sur le CD du journal.

La technologie COM (Component Object Model)

Pour beaucoup de développeurs .net, utiliser la technologie COM pour piloter un diaporama, ou générer un document complexe, relève de l’arrachage de cheveux et la difficulté vient probablement d’abord du manque d’information que Microsoft consent à donner sur le sujet ! Mais une fois apprivoisée, cette technologie se révèle remarquablement puissante et permet un fort contrôle sur l’application. Quelques définitions s’imposent avant de nous lancer dans notre petite application.

Qu’est ce que COM ?

COM est d’abord un modèle de conception que Microsoft a utilisé pour permettre l’interaction des applications entre elles. On définit dans COM des interfaces, des objets implémentant ces interfaces et constitués d’un certain nombre de propriétés et de méthodes. Prenant un contexte plus généraliste, Automation, ou OLE Automation, représente chez Microsoft à la fois la technologie COM mais aussi les outils, langages de scripts, permettant de créer et de manipuler l’application. On parle ainsi d’Automation sur la suite Office car on peut à la fois créer des macros et des add-ins en VBA et manipuler à distance l’application par l’intermédiaire de COM. Dans le cas de language managé comme dans .net, la communication avec COM est possible grâce à un intermédiaire, un wrapper, qui fait le lien entre les types du langage managé, et les types COM. C’est pourquoi lorsque vous ajoutez une référence COM sur Visual Studio, l’environnement génère ou utilise un wrapper (RCW pour Runtime Callable Wrapper). Ce wrapper est compilé dans un assembly appelé interop assembly parce qu’il assure justement cette interopérabilité. Bien que COM représente une technologie ancienne, il est fortement utilisé dans le monde des développeurs sur Windows et sera toujours utilisé pour Office 2007 et Windows Vista.

Les Primary Interop Assembly

Les applications Office se comportent comme des serveurs COM, exposant un certain nombre d’objets. Pour communiquer avec COM, Le CLR (Commun Langage Runtime) de .net nécessite qu’on lui fournisse un assembly d’interopérabilité dont nous venons de parler. Microsoft fournit justement ces assembly, qu’il appelle PIA pour Primary Interop Assembly. C’est à partir de cet assembly que l’on peut fournir à .NET la description des interfaces et types COM. Microsoft a fournit des PIA pour Office 2000 et Office 2003. à chaque version est associé ses propres PIA.


Figure 1. L’application que vous pouvez retrouver sur le CD-ROM de ce numéro



Avant toute chose, il faut installer sur sa machine les PIA Office. Ceux-ci sont disponibles dans l’installation personnalisée d’office par l’option (Prise en charge de la programmabilité .net), à cocher dans chacune des applications Office (Word, Excel, PowerPoint,Outlook, MSGraph). à noter que ces options ne s’affichent que si le framework .NET (1.1) est déjà installé sur votre ordinateur, soyez donc à jour ! Ces prérequis sont indispensables pour exécuter les exemples de cet article.

Tableau 1. Tableau simplifié, venant de MSDN, montrant une partie des PIA d’Office (Source : Installing and Using the Office 2003 Primary Interop Assembly, http://msdn.microsoft.com/office/tool/net/default.aspx?pull=/library/en-us/dno2k3ta/html/officeprimaryinteropassembliesfaq.asp)

Application office 2003Application office 2003Namespace PIA

Microsoft Graph 11.0 Object Library

Microsoft Graph 11.0 Object Library

Microsoft.Office.Interop.Graph

Microsoft Office 11.0 Object Library

Office.dll

Microsoft.Office.Core

Microsoft PowerPoint 11.0 Object Library

Microsoft.Office.Interop.PowerPoint.dll

Microsoft.Office.Interop.PowerPoint

Microsoft Word 11.0 Object Library

Microsoft Word 11.0 Object Library

Microsoft.Office.Interop.Word

DOM (Document Object Modele) d’Office

Pour aborder de manière sereine l’Automation Office, vous devez explorer et apprendre à naviguer avec les interfaces et objets COM exposés dans le Document Object Model de chacune des applications d’Office. Vous pouvez les consulter par le site MSDN ou directement sur l’aide Office (dans la table des matières, choisissez Référence Visual Basic) La structure même des DOM Office est complexe et liée aux standards d’évolutivité fixés par COM. Chaque modèle expose des objets, des collections d’objets (Application, Window, Shape,), des propriétés et des méthodes. Bien que peu documentés, les modèles vous serviront de référence pour l’automatisation Office.


Figure 2. Schéma montrant la place d’un wrapper entre .NET et un serveur COM

Un premier exemple : un générateur de diapositives PowerPoint

PowerPoint est un logiciel de présentation multimédia, c'est-à-dire qu’il diffuse du contenu (textes, images, graphes …) par l’intermédiaire d’un diaporama. Une application PowerPoint est constituée d’une ou plusieurs présentation(s), pouvant faire l’objet d’un mode diaporama (SlideShow), c'est-à-dire une diffusion en plein écran. Chaque présentation est constituée d’un ensemble de diapositives (Slides), et à l’intérieur de chaque diapositive un ensemble de zones de textes, images, graphiques, représentées par l’objet générique forme (Shape). Sur PowerPoint, les Shapes sont organisées en une mise en page les positionnant de façon simple. La personnalisation du fond se fait quant à elle grâce aux masques (Master). Les shapes contribuant à la mise en page d’une diapositives sont appelées, sur PowerPoint, zones réservées. J’ai pris en exemple PowerPoint pour illustrer notre article pour ses côtés ludiques, et pour la variété de manipulation que l’on peut y effectuer. Vous trouverez par ailleurs plus facilement de la documentation sur l’automation sur Word ou Excel que sur PowerPoint.




Figure 3. On doit cocher Prise en charge de la programmabilité .NET pour la prise en charge .NET




Figure 4.
L’aide sur Office intčgre le DOM

Lancer une application PowerPoint



Commençons donc par ajouter une référence sur Visual Studio 2005 Microsoft PowerPoint 11.0 Object Library (menu Projet, Ajouter une référence, onglet COM). Vous constaterez que votre référence est ajoutée l’explorateur de solution. Le Listing 1 vous montre la classe PowerPoint.cs qui servira de support à notre article. Le namespace permettant de retrouver les objets COM est relativement long … Ajoutons simplement un alias :

using PPT = Microsoft.Office.Interop. PowerPoint;

Nous manipulerons les définitions des objets COM par l’intermédiaire de cet alias. (Par exemple, PPT.Application). Stockons aussi nos référence d’objets les plus importantes :

private PPT.Application monAppli; private PPT.Presentation diaporama;

Nous pouvons maintenant créer une fonction LanceApplication() pour lancer l’application. On peut tout à fait lancer PowerPoint directement :

this.monAppli = new PPT.Application();

Cependant on préfèrerait plutôt vérifier si l’application est déjà lancée. Pour cela, on cherche le processus powerpnt dans la liste des processus et on l’ouvre.

System.Diagnostics.Process[] proc = System.Diagnostics.Process.GetProcessesByName("powerpnt"); if (proc.GetLength(0) > 0) try { this.monAppli = (PPT.Application)System. Rutime.InteropServices.Marshal. GetActiveObject("PPT.Application"); } catch { this.monAppli = new PPT.Application(); } else this.monAppli = new PPT.Application();

monAppli est alors affecté à la référence de l’application PowerPoint. On veut aussi rendre visible l’application, car l’utilisateur doit pouvoir s’en servir…

this.monAppli.Visible =Microsoft.Office.ore.MsoTriState.msoTrue;

Notez que la propriété Visible fait référence à une énumération dans le namespace commun pour toutes les applications office, Microsoft.Office.Core. Notez aussi que sur le DOM, les opérateurs booléens true/false sont en général remplacées par l’énumération MsoTriState. Prenez les valeurs msoTrue et msoFalse pour les opérations booléennes. Dans notre application, on va simplement créer une nouvelle présentation de novo, à l’aide de la fonction NouvellePresentation() :

this.diaporama = this.monAppli. Presentations.Add(Microsoft.Office.Core. MsoTriState.msoTrue);

Créez un formulaire Windows, un bouton, et appelez ces deux fonctions. Voila, vous avez ouvert PowerPoint et créé votre document !


Listing 1. La classe PowerPoint contient les accesseurs et le pilotage de l’application Office
using System;
using System.Collections.Generic;
using System.Text;
using PPT = Microsoft.Office.Interop.PowerPoint;
namespace TestAutomation {
class PowerPoint {
/// Ma référence à powerpoint
internal PPT.Application monAppli;
/// Ma référence au diaporama
internal PPT.Presentation diaporama;
/// Lancer un diaporama powerpoint ou récupérer
/// l'instance courante...

public void LancerPowerPoint() {
/// Y a t'il déjà un processus powerpoint?
System.Diagnostics.Process[] proc = System.Diagnostics.Process.
GetProcessesByName("powerpnt");
if (proc.GetLength(0) > 0)
try {
this.monAppli = (PPT.Application)System.Runtime.
InteropServices.
Marshal.GetActiveObject("PPT.Application");
} catch {
this.monAppli = new PPT.Application();
}
else this.monAppli = new PPT.Application();
///On a besoin de voir PowerPoint
this.monAppli.Visible = Microsoft.Office.Core.
MsoTriState.msoTrue;
}
/// Ajoute une nouvelle présentation
public void NouvellePresentation()
{
if (this.monAppli == null)
throw new Exception("Non, cette application ne peut pas
être nulle arrivé à ici ...");
this.diaporama = this.monAppli.Presentations.Add(
Microsoft.Office
.Core.MsoTriState.msoTrue);
}
/// Ouverture de document
///
///
public void OuvrirDocument(string filename) {
if (!System.IO.File.Exists(filename)) throw new Exception (
"Le fichier powerpoint n'existe pas.");
bool active = false;
// Y a t'il déjà ce diaporama d'ouvert?
foreach (PPT.Presentation p in this.monAppli.Presentations)
if (p.FullName == filename)
{
this.diaporama = p;
active = true;
}
if (!active)
this.diaporama = this.monAppli.Presentations.Open(filename,
Microsoft.Office.Core.MsoTriState.msoTrue,
Microsoft.Office.Core.MsoTriState.msoTrue, Microsoft.Office.Core.
MsoTriState.msoTrue);
}
/// Créée une nouvelle diapositive
/// Mise en page des zones réservées
/// de PowerPoint
///
public PPT.Slide CreerDiapositive(PPT.PpSlideLayout layout)
{
if (this.diaporama == null)
throw new Exception("Le diaporama ne doit pas être nul...");
return this.diaporama.Slides.Add(this.diaporama.Slides.Count
+ 1, layout);
}
/// Affectation du titre de la diapositive
/// L'objet Slide /// name="titre">Le texte du titre
public void SetTexteDiapositive(PPT.Slide slide, string texte,
PPT.PpPlaceholderType typezonereservee)
{
if (slide == null)
throw new Exception
("La slide n'a pas pu être précédemment générée...");
foreach (PPT.Shape s in slide.Shapes.Placeholders)
if (s.PlaceholderFormat.Type == typezonereservee)
s.TextFrame.TextRange.Text = texte;
}
#region diaporama
/// Lance un nouveau diaporama
public void LancerDiaporama()
{
if ( this.monAppli.SlideShowWindows.Count < 1)
this.diaporama.SlideShowSettings.Run();
}
/// Va chercher une slide par son index
///
public void VaChercherLycos(int slideindex)
{
if (this.monAppli.SlideShowWindows.Count > 0)
this.diaporama.SlideShowWindow.View.GotoSlide(slideindex,
Microsoft.Office.Core.MsoTriState.msoTrue);
}
/// Arrete le diaporama
///
public void ArreteDiaporama()
{
this.diaporama.SlideShowWindow.View.Exit();
}
/// Fournit une liste de textes pour l'exportation
/// word...

///
public List FournitListeTexte(PPT.PpPlaceholderType
typezonereservee) {
List list = new List ();
foreach (PPT.Slide slide in this.diaporama.Slides)
foreach (PPT.Shape s in slide.Shapes.Placeholders)
if (s.PlaceholderFormat.Type == typezonereservee)
list.Add(s.TextFrame.TextRange.Text);
return list;
}
#endregion
}
}
Générer une diapositive et diffuser un contenu à l’aide des Zones réservées

Dans PowerPoint, lorsque vous ajoutez une diapositive, le panneau Mise en page des Diapositives vous permet de choisir plusieurs modèles de mise en page de shapes (titre, résumé, graphe) de disposition différente. Les shapes ainsi rendues ont ceci de spéciales qu’elles ont été créées par le modèle de mise en page, et portent le nom de zones réservées. Au niveau du code, nous pouvons tout à fait choisir notre modèle de mise en page par l’intermédiaire de l’énumération PpSlideLayout. La génération d’une diapositive est relativement simple : il suffit d’appeler la méthode Add de la propriété Slides sur l’objet Presentation. Ici, nous ajouterons un modèle simple générant une diapositive avec un titre, et un résumé :

this.diaporama.Slides.Add(this.diaporama.Slides.Count + 1, PpSlideLayout.ppLayoutText);


Listing 2. La classe Word utilisé pour manipuler Word
using System;
using System.Collections.Generic;
using System.Text;
using Wd = Microsoft.Office.Interop.Word;
namespace TestAutomation
{
class Word
{
/// Référence à l'application. L'application est
/// en static, pour éviter de la lancer
/// systématiquement

private Wd.Application monAppli;
/// Objet de référence pour le type missing
/// (on est obligé de le passer en réf)

private object missing = Type.Missing;
/// Le document Word sur lequel on passe la base
/// de travail

Wd.Document doc;
///
/// On lance directement Word en instanciant la classe
/// qu'on ne gardera pas.
///

public Word()
{
monAppli = new Wd.Application();
monAppli.Visible = true;
this.doc = monAppli.Documents.Add(ref missing, ref missing,
ref missing, ref missing);
}
///
/// Tableau courant qui nous sert pour ajouter des lignes
/// et des colonnes avec un champ Titre, et un champ Résumé
///

private Wd.Table tabCourant;
/// Ajout d'un tableau
public void AddTab()
{
object zero = 0;
tabCourant = doc.Tables.Add(this.doc.Range(
ref zero, ref zero), 1, 2, ref missing, ref missing);
tabCourant.Rows[1].Cells[1].Range.Text = "Titre";
tabCourant.Rows[1].Cells[2].Range.Text = "Texte";
}
/// Ajout d'une ligner sur le tableau ref
/// tabCourant doit être non nul

///
public void AddRow(string titre, string texte)
{
Wd.Row r = tabCourant.Rows.Add(ref missing);
r.Cells[1].Range.Text = titre;
r.Cells[2].Range.Text = texte;
}
}
}
Vous remarquez sur cette méthode Add deux paramètres, le premier étant la position à renseigner au diaporama. On met la diapositive à la fin, d’où l’addition (somme des slides + 1), le deuxième étant le modèle de mise en page, ici PpSlideLayout.ppLayoutText qui génère une diapositives avec deux zones réservées, titre et texte. Bon, mais le travail n’est pas fini, car il faut aussi retrouver les zones réservées dans la diapositive nouvellement créée, et leur assigner un texte. Pour cela, nous allons énumérer les shapes sur la slide :

/// typezonereservee est notre zone réservée /// rechercher, slide est notre diapositive foreach (PPT.Shape s in slide.Shapes.Placeholders) if (s.PlaceholderFormat.Type == typezonereservee) s.TextFrame.TextRange.Text = texte;

Notez que la collection slide. Shapes liste l’ensemble des shapes. Alors que slide.Shapes.Placeholders liste l’ensemble des shapes de type zone réservée. Notez aussi que l’index d’énumération d’un tableau sur PowerPoint commence toujours à 1 : slide.Shapes[0] n’existe donc pas et renverra une exception. Vous trouverez sur le Listing 1 les fonctions :

PPT.Slide CreerDiapositive (PPT.PpSlideLayout layout) void SetTexteDiapositive (PPT.Slide slide, string texte, PPT.PpPlaceholderType typezonereservee)

Si vous voulez associer un masque précis avec votre diapositive, il faut d’abord nommer le masque sur PowerPoint (en allant sur le masque, puis dans le menu contextuel de la vignette du masque en cliquant sur renommer le masque). à noter que l’on accède au masque par la propriété Designs de l’objet présentation. Dans tous les cas, n’oubliez pas que l’utilisateur peut tout à fait renommer un masque, supprimer une slide, ou fermer une présentation : il conserve le contrôle de son application Office. Il est donc essentiel de sécuriser votre environnement et de gérer les exceptions soulevées par PowerPoint.


Listing 3. Le formulaire Windows utilisé pour dans l’application PowerPoint
private TestAutomation.PowerPoint maClassePPT =
new PowerPoint();
private TestAutomation.Word maClasseWd = new Word();
/// Event. Je clique sur "ouvrir ma présentation"
///

///
private void btOuvrirPPT_Click(object sender, EventArgs e)
{
maClassePPT.LancerPowerPoint();
maClassePPT.NouvellePresentation();
}
/// Event J'ajoute ma diapo à l'aide de deux textbox :
/// tbResume, et tbTitre
///

///
private void btAjouterDiapo_Click(object sender, EventArgs e)
{
if (this.tbResume.Text == string.Empty || this.tbTitre.Text ==
string.Empty) {
MessageBox.Show("Remplissez bien tous les champs ;) ");
return;
}
PPT.Slide slide = maClassePPT.CreerDiapositive(
PPT.PpSlideLayout.ppLayoutText);
if (slide == null)
MessageBox.Show("La slide n'a pas pu être créé, vérifier
le document PowerPoint");
maClassePPT.SetTexteDiapositive(slide, this.tbTitre.Text,
Microsoft.Office.Interop.PowerPoint.PpPlaceholderType.
ppPlacehol derTitle);
maClassePPT.SetTexteDiapositive(slide, this.tbResume.Text,
Microsoft.Office.Interop.PowerPoint.PpPlaceholderType.
ppPlacehol derBody);
}
/// Event. J'ouvre mon diaporama (plein écran)
///

///
///
private void btOpenDiaporama_Click(object sender, EventArgs e)
{
maClassePPT.LancerDiaporama();
this.timer.Start();
}
/// timer : au hasard, il sélectionne une diapositive
/// de la présentation
///

///
private void timer_Tick(object sender, EventArgs e)
{
maClassePPT.VaChercherLycos(new Random().Next(1,
maClassePPT.diaporama.Slides.Count+1));
}
/// Stopper diaporama
///
///
private void btStopDiaporama_Click(object sender, EventArgs e)
{
this.timer.Stop();
maClassePPT.ArreteDiaporama();
}
/// exporte Word : il fournit une liste de textes
/// de diapo pour la publier sur Word
///

///
private void btExporterWord_Click(object sender, EventArgs e)
{
List titre =
maClassePPT.FournitListeTexte(Microsoft.Office.Interop.
PowerPoint.PpPlaceholderType.ppPlaceholderTitle);
List texte =
maClassePPT.FournitListeTexte(Microsoft.Office.Interop.
PowerPoint.PpPlaceholderType.ppPlaceholderBody);
if (texte.Count != titre.Count)
{
MessageBox.Show("Les diapos ont été modifiés (shapes
supprimés!) entre la génération et l'exportation! ");
return;
}
maClasseWd = new Word();
int index = 0;
maClasseWd.AddTab();
foreach (string s in titre)
maClasseWd.AddRow(s, texte[index++]);
}
Piloter le diaporama

Nous allons maintenant faire un peu plus compliqué, en pilotant directement le mode diaporama de Powerpoint et lui demander de changer de slide de manière aléatoire. Nous ajouterons un évènement qui nous informera qu’une slide a été modifiée. Le tout vous est présenté sur le Listing. Pour diffuser un diaporama (plein écran), une seule instruction suffit :

this.diaporama.SlideShowSettings.Run(); Pour choisir la bonne diapositive (slideindex), il faut connaître la propriété slideindex de la diapo, c'est-à-dire son index dans la collection de diapositives (de 1 à n diapositive, l’énumération commençant à partir de 1 et non 0).

this.diaporama.SlideShowWindow.View.GotoSli de(slideindex, Microsoft.Office.Core.MsoTriS tate.msoTrue);

Vous remarquez que les instructions sont simples, mais le chemin pour y arriver est confus : pour diffuser un diaporama, vous utilisez directement la propriété SlideShowSettings, pour arrêter la diffusion, vous utilisez SlideShowWindow.View.Exit() , pour changer de diapositive, SlideShowWindow.View.GotoSlide(). Difficile de s’y retrouver quelque fois, alors n’hésitez pas à bien consulter les DOM sur le site MSDN ou présent directement dans l’aide d’Office (voir plus haut dans l’article).

Un second exemple : un rapport généré avec Word

Comme toutes les applications Office, la plupart des utilisateurs de Word ne se servent que d’un très petit nombre de fonctionnalités par rapport à la totalité existente. L’automation Word peut être très utile pour rédiger des rapports, des formulaires, etc… On écrit généralement un modèle de document que l’on enregistre (template) , contenant des signets nommés (menu insertion > signet), ou des champs. Les signets sont comme un marqueur où l’on se place pour coller un texte, alors qu’un champ permet d’encadrer la valeur à changer. Vous pourrez trouver de nombreux articles sur le Web pour automatiser Word, je ne vous en donne qu’un bref aperçu. Dans notre application, nous nous servirons de Word simplement pour ajouter un tableau, et nous illustrerons deux fonctions servant à ajouter du texte à partir de signets et de champs.

Lancer l’Application

Lancer Word est similaire à PowerPoint, et relativement simple. Dans notre cas, nous ajoutons un simple document (Listing 2), sans nommer explicitement le template. Sur Word, les paramètres doivent être passés par référence, et lorsqu’ils sont optionnels, on ajoute la référence d’un type inconnu sur le CLR :

private object missing = Type.Missing;

Word est à ce point de vue bien plus permissif que PowerPoint, la plupart des arguments des fonctions étant optionnels.


Figure 5.
Une partie du modčle objet Word , tel qu’il est présenté dans l’aide pour Office et sur MSDN



Pour lancer un document Word, l’instruction a donc la forme suivante, correspondant à un document vide, sans template, et sans mise en page particulière

monAppli.Documents. Add(ref missing, ref missing, ref missing, ref missing);

Dans le cas où l’on veut travailler avec un document associé à un template, nous permettant de conserver ainsi une mise en page, un gabarit, des signets et des champs, on référence le nom du template, normalement conservé dans {Lecteur}Documents and Settings{Nom User}Application DataMicrosoftModèles

object nom = “montemplate”; this.doc = msWord.Documents. Add(ref nom,ref missing, ref missing, ref missing);


Figure 6. Mise en page sur PowerPoint des diapositives par l’insertion de zones réservées



Ajouter un tableau

Un tableau s’ajoute ligne par ligne puis cellules par cellules. Word stocke l’ensemble de ses tableaux dans une collection d’objet Table :

object zero = 0; tabCourant = doc.Tables.Add (this.doc.Range(ref zero, ref zero), 1, 2, ref missing, ref missing);

Pour ajouter un tableau, on doit renseigner à Word où on peut le placer. Word utilise pour cela l’objet Range (que l’on utilise pour pratiquement toutes les opérations de texte) , qui peut s’imaginer : comme un curseur à un endroit du document, par exemple au caractère 5 : Range(5, 5) ) ; ou comme une sélection de texte, par exemple du caractère 1 au caractère 5 : Range(1, 5). Sur le Listing 2, vous trouverez les fonctions AddTab et AddRow, qui illustrent ces propos.

Travailler avec les signets et les champs

En travaillant avec un template, on peut mémoriser des signets pour insérer du texte, en générant des documents. Cela nécessite dans un premier temps, de réaliser le modèle et de l’enregistrer. Une fois le document Word ouvert et associé au bon template, on peut chercher son signet et remplacer des éléments de texte. Pour cela, on accède d’abord au signet par l’objet BookMark :

Range copy = doc.Bookmarks. get_Item(reflesignet).Range;

Le paramètre fournit en exemple est la référence de l’identifiant du signet. Le signet va nous fournir un range, donc un marqueur, qui sera utilisé pour insérer notre texte.

doc.Bookmarks.get_Item(ref lesignet) .Range .Text = "Notre texte";

Le principe est identique pour la mise à jour de champs, que l’on accède par l’objet FormFields :

doc.FormFields.get_Item(ref objet).Result = c.Value;

Conclusion

Ces quelques paragraphes vous ont, je l’espère, éclairé sur l’utilisation des techniques d’automatisation des documents Office depuis un programme .NET. Vous avez abordé la gestion d’un document Word, l’insertion de signet, de champs, de tableaux. Vous avez manipulé PowerPoint, piloté un diaporama, généré automatiquement des diapositives. Sur le net, vous trouverez une quantité de tutoriaux destinés à l’automation Word et Excel, mais vous en trouverez beaucoup moins sur PowerPoint ou Outlook. N’hésitez pas à consulter les newsgroups très actifs sur Office. Si vous avez des questions sur l’automation, n’hésitez pas non plus à m’envoyer un mail cadherins@gmail.com. La prochaine version 2007 d’Office continuera d’exposer des interfaces COM et ce sera toujours la première voie utilisée pour commander l’application à distance. Pour explorer plus en profondeur ces techniques, rendez-vous sur le site MSDN, section développement Win32 et COM ! Vous pourrez retrouver sur le CD la solution, ainsi que les DOM Office, Word et PowerPoint.


JEAN-SÉBASTIEN COUDRAY
Jean-Sébastien Coudray est un ingénieur d'étude de 28 ans, travaillant dans une société événementielle (Digimedia, vote électronique par boîtier et applications collaboratives). Passionné par les technologies .net depuis le début, il travaille depuis six mois sur une solution collaborative appelée Forali@ utilisant SQL Serveur, la suite Office, et le remoting, pour faire interagir des centaines d’ordinateurs.

Sur Internet


Cet article est aussi disponible dans la version pdf a télécharger :
http://mscoder.org/fr/mscoder/download.html

Contactez-nous
Avez-vous des questions à nous poser ?
Souhaitez-vous acheter
un magazine ?
Contactez-moi !



Chercher