Piloter word via microsoft.office.interop.word

Soyez le premier à donner votre avis sur cette source.

Vue 17 837 fois - Téléchargée 1 569 fois

Description

Cette classe permet d'ouvrir un document word, d'écrire des données à la suite d'un signet, de le fusionner avec d'autres documents, de supprimert une page et de le sauver.
Il faut mettre Microsoft.Office.Interop.Word et Microsoft.Office.Core en référence, vous les trouverez sous WIndows/Assembly ou dans le zip

Source / Exemple :

 
using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;
using Microsoft.Office.Interop.Word;

namespace GestionOfficeWord
{
    class GestionWord
    {
        #region Déclarations

        Microsoft.Office.Interop.Word.Application _ApplicationWord;
        Microsoft.Office.Interop.Word._Document _MonDocument;
        //Microsoft.Office.Interop.Word.Selection _MaSelection;
        Microsoft.Office.Interop.Word.Range _MonRange;
        Bookmark _MonSignet;
        Bookmarks _MesSignets;
        InlineShape _MonImage;

        object M = System.Reflection.Missing.Value;

        #endregion

        #region Initialisation Sauvegarde

        /// <summary>
        /// Cette classe sert d'interface entre word et une apllication C#.
        /// Le constructeur démarre word.
        /// </summary>
        public GestionWord()
        {
            //_ApplicationWord = new ApplicationClass();
            _ApplicationWord = new Microsoft.Office.Interop.Word.Application();
            _ApplicationWord.Visible = true;
        }

        /// <summary>
        /// Ouvre un fichier existant.
        /// </summary>
        /// <param name="FileName">Chemin du document</param>
        public void OuvrirFichier(string FileName)
        {
            object oFileName = (object)FileName;
            object Faux = (object)false;
            object Vrai = (object)true;

            _MonDocument = _ApplicationWord.Documents.Add(ref oFileName, ref Faux, ref M, ref Vrai);
        }

        /// <summary>
        /// Enregistrer le document sous.
        /// </summary>
        /// <param name="FileName">Chemin du docmuent</param>
        public void Sauver(string FileName)
        {
            object oFileName = (object)FileName;
            object Faux = (object)false;
            object Vrai = (object)true;

            try
            {
                _MonDocument.SaveAs(ref oFileName, ref  M, ref  M, ref  M, ref  M, ref  M, ref  M, ref  M, ref  M, ref  M, ref M, ref  M, ref  M, ref  M, ref  M, ref  M);
            }
            catch
            {
                MessageBox.Show("Le fichier Word n'a pas pu être enregistré.", "Erreur d'enregistrement", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
            }
        }

        /// <summary>
        /// Fermer le document et l'application word.
        /// </summary>
        public void Fermer()
        {
            _MonDocument.Close(ref M, ref M, ref M);
            _ApplicationWord.Application.Quit(ref M, ref M, ref M);
        }

        #endregion

        #region Manipulation document

        /// <summary>
        /// Fusionne plusieurs documents en un seul.
        /// </summary>
        /// <param name="FichierPrincipal">Document à la suite duquel les autres seront insérer.</param>
        /// <param name="FichiersAInserer">Tableau contenant les chemins des documents à insérer</param>
        public void FusionnerPlusieurFichiers(string FichierPrincipal,string[] FichiersAInserer)
        {
            this.OuvrirFichier(FichierPrincipal);

            //on insere une page vierge sinon ça merde, nécessit une signet à la fin de la page
            this.AtteindreSignet("FinPage");
            object Type = (object)WdBreakType.wdPageBreak;
            _MonRange.InsertBreak(ref Type);

            //on insere les fichiers words exétieurs
            //decompte à l'envers car, il insere le fichier apres le saut de page,
            //puis le fichier suivant au même endroit etc..
            for (int i = FichiersAInserer.Length - 1; i > -1; i-- )
            {
                string FileName = FichiersAInserer[i];
                _MonRange.InsertFile(FileName, ref M, ref M, ref M, ref M);
            }

            //on supprime la page vierge
            this.SupprimePage(FichiersAInserer.Length + 2);
        }

        /// <summary>
        /// Supprime une page.
        /// </summary>
        /// <param name="NumeroPage">Numéro de la page à supprimer</param>
        public void SupprimePage(int NumeroPage)
        {
            AtteindrePage(NumeroPage);

            //Supprime la selection
            Selection MaSelection = _ApplicationWord.Selection;
            MaSelection.TypeBackspace();
        }

        /// <summary>
        /// Insere un saut de page aprés le range 
        /// </summary>
        public void InsererPage()
        {
            Object Typ = (object)WdBreakType.wdPageBreak;
            _MonRange.InsertBreak(ref Typ);
        }

        #endregion

        #region Traitement de Texte

        /// <summary>
        /// Atteindre un signet dans le document.
        /// </summary>
        /// <param name="NomSignet"></param>
        /// <returns></returns>
        public bool AtteindreSignet(string NomSignet)
        {
            object Nom = (object)NomSignet;

            //récupére la liste de signets
            _MesSignets = _MonDocument.Bookmarks;

            //si le signet cherché existe
            if (_MesSignets.Exists(NomSignet))
            {
                //on positionne le range sur le signet et la fonction retourne true
                _MonSignet = _MesSignets.get_Item(ref Nom);
                _MonSignet.Select();
                _MonRange = _MonSignet.Range;
                return true;
            }
            else
            {
                //Un message d'erreur est affiché, et la fonction retourne false
                MessageBox.Show(string.Format("Le signet {0} n'existe pas dans le fichier.", NomSignet), "Insertion impossible", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                return false;
            }
        }

        /// <summary>
        /// Atteindre un signet dans le document et insérer du texte aprés.
        /// </summary>
        /// <param name="NomSignet"></param>
        /// <param name="Texte">Texte à insérer</param>
        /// <returns></returns>
        public bool AtteindreSignet(string NomSignet, string Texte)
        {
            //si on a atteint le signet
            if (AtteindreSignet(NomSignet))
            {
                //on insère le texte aprés le signet, la fonction retourne true
                _MonRange.InsertAfter(Texte);
                return true;
            }
            return false;
        }

        /// <summary>
        /// Ecrire du texte à la suite de l'emplacement séléctionné.
        /// </summary>
        /// <param name="Texte"></param>
        /// <returns></returns>
        public bool EcrireTexteApresLaSelection(string Texte)
        {
            try
            {
                //on insère le texte aprés le signet, la fonction retourne true
                _MonRange.InsertAfter(Texte);
                return true;
            }
            catch
            {
                return false;
            }
        }

        /// <summary>
        /// Applique la valeur WdParagraphAlignment à un range
        /// </summary>
        /// <param name="Alignement"></param>
        public void AlignementRange(WdParagraphAlignment Alignement)
        {
            _MonRange.ParagraphFormat.Alignment = Alignement;

        }

        /// <summary>
        /// Atteint et selectionne une page
        /// </summary>
        /// <param name="NumeroPage"></param>
        public void AtteindrePage(int NumeroPage)
        {
            object what = (object)WdGoToItem.wdGoToPage;
            object whitch = (object)WdGoToDirection.wdGoToFirst;
            object Numero = (object)NumeroPage;

            //Atteindre la page voulue
            _MonRange = _MonDocument.GoTo(ref what, ref whitch, ref Numero, ref M);

            //La selectionner
            _MonRange.Select();

        }

        #endregion

        #region Image

        /// <summary>
        /// Insere une photo à l'endroit sélectionné.
        /// </summary>
        /// <param name="FichierImage"></param>
        public void InsereImage(string FichierImage)
        {
                //Selection.InlineShapes.AddPicture FileName:= _
            object False = (object)false;
            object True = (object)true;
            _MonImage = _MonRange.InlineShapes.AddPicture(FichierImage, ref False, ref True, ref M);
        }

        /// <summary>
        /// Modifie la taille de l'image.
        /// </summary>
        /// <param name="Pourcent"></param>
        public void TailleImage(int Pourcent)
        {
            float Height = _MonImage.Height;// = 360.3
            float Width = _MonImage.Width;// = 256.8

            _MonImage.Height = Height * Pourcent / 100;
            _MonImage.Width = Width * Pourcent / 100;


        }

        #endregion

        public void InertionTableau(int NombreLignes, int NombreColones)
        {
            object defaultTableBehavior = (object)WdDefaultTableBehavior.wdWord9TableBehavior;
            object autoFitBehavior = (object)WdAutoFitBehavior.wdAutoFitFixed;

            _MonDocument.Tables.Add(_MonRange, NombreLignes, NombreLignes, ref defaultTableBehavior, ref autoFitBehavior);

            _MonRange = _MonDocument.Tables[_MonDocument.Tables.Count].Range;
        }


    }
}


Conclusion :

Certaines fonctions sont déjà présentes sur le forum, d'autres non. C'est pourquoi je les ai rassemblées à l'instar d'une classe similaire que j'ai déjà déposée pour Excel.

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

chew37
Messages postés
4
Date d'inscription
lundi 25 mai 2009
Statut
Membre
Dernière intervention
9 avril 2010
-
Salut, merci pour ton post il a l'air super.
par contre j'ai deux petites questions. la première c'est comment tu met un signet dans un fichier WORD pour repérer l'endroit ou tu ajouter tes modifications?
la seconde : pour ma part, dans le fichier WORD je dois y ajouter a la page n, une image Bitmap que j'ai créé, est ce que c'est possible?

Merci par avance de tes réponses.

et encore merci pour ce post, super utile
Whismeril
Messages postés
13520
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
21 juillet 2019
289 -
Pour inserer un signet, tu postionnes le curseur à l'endroit voulu, dans 2007, dans l'onglet "Inserer" tu cliques sur "signet" et tu lui donnes un nom. Dans 97/2003, menu "Inserer" et "Signet".

Par contre, je ne sais pas comment faire pour l'image, je vais regarder.
@+
chew37
Messages postés
4
Date d'inscription
lundi 25 mai 2009
Statut
Membre
Dernière intervention
9 avril 2010
-
Merci c'est vraiment top ce que tu as fait là.
Donc en gros si j'ai bien compris, il faut juste que j'appel la méthode InsertImage a la place de la méthode InsertAfter?

Merci encore je vais étudier ton code à fond
Whismeril
Messages postés
13520
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
21 juillet 2019
289 -
Mise à jour vers visual studio 2017 et Word 2010.
Ajout de la possibilité de mettre un tableau.
Ajout d'une version VB.net dans le zip.
Noupik
Messages postés
5
Date d'inscription
lundi 27 mai 2013
Statut
Membre
Dernière intervention
14 avril 2018
-
Bonjour, sympa ton post

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.