Piloter word via microsoft.office.interop.word

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

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.