Piloter word via microsoft.office.interop.word

Soyez le premier à donner votre avis sur cette source.

Vue 26 366 fois - Téléchargée 1 996 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
Whismeril Messages postés 18641 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 3 octobre 2023 629
13 avril 2018 à 13:52
Merci
Noupik Messages postés 5 Date d'inscription lundi 27 mai 2013 Statut Membre Dernière intervention 14 avril 2018
13 avril 2018 à 13:10
Bonjour, sympa ton post
Whismeril Messages postés 18641 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 3 octobre 2023 629
15 nov. 2017 à 22:20
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.
chew37 Messages postés 4 Date d'inscription lundi 25 mai 2009 Statut Membre Dernière intervention 9 avril 2010
14 mars 2010 à 22:25
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 18641 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 3 octobre 2023 629
12 mars 2010 à 21:23
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.
@+

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.