Pilotage OLE de Word à partir de Delphi

Ce document a pour but de présenter une méthode simple de pilotage OLE de Word à partir de Delphi.

Article lu   fois.

L'auteur

Profil ProSite personnel

Liens sociaux

Viadeo Twitter Facebook Share on Google+   

Avant-propos

Ce document a pour seul but de présenter une façon simple de piloter Word, en restant indépendant des composants de Delphi.
Le code a été écrit et testé avec Delphi 7 et Word 2000 français.

Les commentaires au code sont minimaux, ceci n'étant pas une explication du fonctionnement de Word, mais simplement l'interfaçage avec Delphi et le code étant, je pense, explicite par lui-même.

L'utilisation du Variant est quasi générale. Pour rappel, le type Variant est un type de variable qui a la particularité de pouvoir ne pas être déterminé au moment de la compilation, et même de changer en cours d'exécution du programme. Son plus grand intérêt, à mon sens, est qu'il peut aussi contenir une interface vers un objet OLE et donner accès aux propriétés, procédures et fonctions de celui-ci.

La comparaison avec le pilotage d'Excel permet de constater qu'à l'exception des noms de collections et d'objets, les techniques sont identiques, à très peu de choses près.

I. Démarrer Word

Avant de pouvoir piloter Word, il est nécessaire d'ajouter ComObj à la clause Uses.

I-A. Ouvrir une nouvelle instance

 
Sélectionnez
var
    vMSWord : variant;
                    
begin
    vMSWord := CreateOleObject('Word.Application');
    vMSWord.Visible := true;
end;

La propriété Visible permet de spécifier si Word est affiché à l'écran ou s'il reste en tâche de fond.

I-B. Se connecter à une instance existante

 
Sélectionnez
var
    vMSWord : variant;
                    
begin
    vMSWord = GetActiveOleObject('Word.Application');
    vMSWord.Visible := true;
end;

Le code suivant permet donc de lancer Word s’il n'est pas déjà actif ou de se connecter à l'instance existante éventuelle :

 
Sélectionnez
try
    vMSWord := GetActiveOleObject('Excel.Application');
except
    vMSExcel := CreateOleObject('Excel.Application');
end;

II. Fermer Word

 
Sélectionnez
var
    vMSWord : variant;
                
begin
    vMSWord.Quit;
    vMSWord :=  unassigned;
end.

Positionner vMSWord à Unassigned permet de libérer le Variant.

III. Créer un nouveau document

 
Sélectionnez
var
     vWDocument, vWDocuments : variant;
                
begin
    vWDocuments := vMSWord.Documents;
    vWDocument := vwDocuments.Add;
end.

Word tient à jour une liste de tous les documents ouverts, dans une collection appelée Documents.
Ouvrir un nouveau document revient simplement à ajouter un nouvel élément à cette collection. La fonction Add renvoie un Variant faisant référence au nouveau document.

IV. Ouvrir un document existant

IV-A. Ouvrir un document simple

 
Sélectionnez
var
    aFileName : AnsiString;
                    
begin
    aFileName := 'c:\Home\Sources\Delphi\Word\Document1.doc';
    vWDocuments := vMSWord.Documents;
    vWDocument := vWDocuments.Open(aFileName);
end;

Ouvrir un document se fait sur le même principe que la création, à savoir l'ajout à la collection Documents d'un nouvel élément, non plus avec la fonction Add, mais la fonction Open.

IV-B. Ouvrir un document en lecture seule

 
Sélectionnez
var
    aFileName : AnsiString;
    vReadOnly, vLink : variant;
                    
begin
    aFileName := 'c:\Home\Sources\Delphi\Word\Document1.doc';
    vLink := unassigned;
    vReadOnly := true;
    vWDocuments := vMSWord.Documents;
    vWDocument := vWDocuments.Open(aFileName, vLink, vReadOnly);
end

Ouvrir un document en lecture seule se fait en passant le 3e paramètre de la fonction Open avec une valeur true.
La fonction Open possède une série de paramètres dont la liste exhaustive se trouve dans l'aide de VBA pour Word.
À noter que les paramètres facultatifs doivent être passés comme des Variants unassigned, et non des nil, comme on pourrait le penser au premier abord.

V. Enregistrer un document

V-A. Enregistrer le document sous le même nom

Une fois le document ouvert, pour l'enregistrer, il suffit de faire :

 
Sélectionnez
var
    vWDocument : variant;
                    
begin
    vWDocument.Save;
end;

V-B. Enregistrer le document sous un autre nom

Une fois le document ouvert, pour l'enregistrer en changeant de nom, il suffit de faire :

 
Sélectionnez
var
    aFileName : AnsiString;
                    
begin
    aFileName := 'c:\Home\Sources\Delphi\Word\SaveAs.doc';
    vWDocument.SaveAs(aFileName);
end

VI. Fermer un document

 
Sélectionnez
var
    aFileName : AnsiString;
    vSaveChanges : variant;
                
begin
    vSaveChanges := true;
    aFileName := 'c:\Home\Sources\Cpp\Word\Document1.doc';
    vWDocument.Close(vSaveChanges);
end

Le 1er paramètre de la fonction Close permet de spécifier si les modifications sont enregistrées

  • true : les modifications sont enregistrées ;
  • false : les modifications ne sont pas enregistrées ;
  • Unassigned : demande à l'utilisateur.

Le 2e paramètre de la fonction Close permet de spécifier le nom sous lequel le classeur sera enregistré.

Ces deux paramètres sont facultatifs.

VII. Utiliser des signets pour insérer du texte dans un document

VII-A. Accéder aux signets

 
Sélectionnez
var
    vBookMarks, vBookMark : variant;
                    
begin
    vBookMarks := vWDocument.BookMarks;
    if vBookMarks.Exists('signet1') then begin
        vBookMark := vBookMarks.Item('signet1');
        vBookMark.Select;
        { .... }                
    end;
end;

Pour accéder à un signet, il faut d'abord ouvrir la collection BookMarks, et vérifier que le signet existe : Exists. La fonction Item permet d'extraire un signet de la collection.
Select permet de l'atteindre.

VII-B. Insérer le texte

 
Sélectionnez
var
     vBookMark, vContent : variant;
                    
begin
     vContent := vBookMark.Range;
     vContent.InsertAfter('texte à insérer');
end;

Une fois le signet atteint, il faut accéder au Range.
La fonction InsertAfter permet d'insérer le texte à la position courante du curseur.

VIII. Lister les signets contenus dans un document

Le code qui suit permet de lister tous les signets contenus dans un document Word et de les afficher dans un ListBox.

 
Sélectionnez
var
    vBookMarks, vBookMark : variant;
    iCount, i : integer;
    aBookName : AnsiString;
                
begin
    vBookMarks := vWDocument.BookMarks;
    iCount := vBookMarks.Count;
    for i := 1 to iCount do begin
        vBookMark := vBookMarks.Item(i);
        aBookName := vBookMark.Name;
        ListBox1.Items.Add(aBookName);
    end;
end;

Vous avez aimé ce tutoriel ? Alors partagez-le en cliquant sur les boutons suivants : Viadeo Twitter Facebook Share on Google+   

Ce document est issu de https://www.developpez.com et reste la propriété exclusive de son auteur.
La copie, modification et/ou distribution par quelque moyen que ce soit est soumise à l'obtention préalable de l'autorisation de l'auteur.