IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Insertion de texte dans un document word via une application C#


Sujet :

C#

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2015
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2015
    Messages : 3
    Points : 2
    Points
    2
    Par défaut Insertion de texte dans un document word via une application C#
    Bonjour,

    Je poste ce message car je suis bloqué depuis (trop) longtemps sur mon projet.

    Je dois créer une application C# qui permette d'insérer du texte dans un document word .docx. J'ai cherché un peu partout, j'ai fait des tests en utilisant XML, LinqToXml. Je connais un peu la structure des fichiers xml présents dans un docx, les noeuds et leur contenu, mais je ne sais pas comment y accéder. J'ai actuellement ce code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    private void button1_Click(object sender, EventArgs e)
            {
                docWord = @"monFichier.docx";
     
                //overture du package en lecture/écriture
                Package officePackage = Package.Open(docWord, FileMode.Open, FileAccess.ReadWrite);
                MessageBox.Show("Fichier chargé avec succès", "Réussi", MessageBoxButtons.OK);
                //mettre ici le code des traitements
     
                //type de contenu pour la partie principale
                const String officeDocRelType = @"http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument";
     
                PackagePart corePart = null;
                Uri documentUri = null;
                //on récupère la partie contenant les propriétés
                foreach (PackageRelationship relationship in officePackage.GetRelationshipsByType(officeDocRelType))
                {
                    // Il n'y a qu'une seule partie de type partType dans le package
                    documentUri = PackUriHelper.ResolvePartUri(new Uri("/", UriKind.Relative), relationship.TargetUri);
                    corePart = officePackage.GetPart(documentUri);
                    break;
                }
     
                if (corePart != null)
                {
                     string cpPropertiesSchema = "http://schemas.openxmlformats.org/package/2006/metadata/core-properties";
                     string dcPropertiesSchema = "http://purl.org/dc/elements/1.1/";
                     string dcTermsPropertiesSchema = "http://purl.org/dc/terms/";
     
                    //construction d'un XmlNamespaceManager contenant les namespaces utilisés
                    NameTable nt = new NameTable();
                    XmlNamespaceManager nsmgr = new XmlNamespaceManager(nt);
                    nsmgr.AddNamespace("dc", dcPropertiesSchema);
                    nsmgr.AddNamespace("cp", cpPropertiesSchema);
                    nsmgr.AddNamespace("dcterms", dcTermsPropertiesSchema);
     
                    //chargement de la partie dans un XmlDocument
                    XmlDocument doc = new XmlDocument(nt);
                    doc.Load(corePart.GetStream());
     
                    XmlNode nodeAuteur = doc.DocumentElement.SelectSingleNode("//dc:creator", nsmgr);
                    if (nodeAuteur != null)
                        labelAuteur.Text = nodeAuteur.InnerText;
     
                    XmlNode nodeTitre = doc.DocumentElement.SelectSingleNode("//dc:title", nsmgr);
                    if (nodeTitre != null)
                        labelTitre.Text = nodeTitre.InnerText;
     
                    XmlNode nodeMotsClefs = doc.DocumentElement.SelectSingleNode("//cp:keywords", nsmgr);
                    if (nodeMotsClefs != null)
                        labelMotsClefs.Text = nodeMotsClefs.InnerText;
     
                    XmlNode nodeDate = doc.DocumentElement.SelectSingleNode("//dcterms:created", nsmgr);
                    if (nodeDate != null)
                        labelDate.Text = DateTime.Parse(nodeDate.InnerText).ToShortDateString();
                }
     
     
     
                //On ferme le package pour éviter un rechargement par erreur
                officePackage.Close();
    }
    Mais mes labels ne changent pas, rien ne se produit visuellement lors du clic sur le bouton.

    Je ne comprends pas comment identifier un noeud et afficher/modifier son contenu.
    Les directives using suivantes sont insérées dans mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows.Forms;
    using System.IO;
    using System.Xml;
    using System.IO.Packaging;
    Et je n'ai aucune erreur générée venant d'un éventuel problème d'assembly.

    Je suis complètement paumé (excusez le terme) et j'aurais besoin d'un peu d'aide...

    Merci d'avance,

    Martin

  2. #2
    Expert confirmé

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Septembre 2006
    Messages
    3 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2006
    Messages : 3 580
    Points : 5 195
    Points
    5 195
    Par défaut
    si tu as pris cette exemple depuis le tutoriel du site, le nom du fichier, s'est : @"c:\Monfichier.docx"

    et là, le nom de ton fichier n'est à priori pas le bon...

    C'est peut-être pour celà que tu ne vois rien changer !
    The Monz, Toulouse
    Expertise dans la logistique et le développement pour
    plateforme .Net (Windows, Windows CE, Android)

  3. #3
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2015
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2015
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par theMonz31 Voir le message
    si tu as pris cette exemple depuis le tutoriel du site, le nom du fichier, s'est : @"c:\Monfichier.docx"
    Hello theMonz,

    Tout d'abord, merci d'avoir répondu si rapidement.

    Alors en fait, j'ai renommé mon fichier word en "monFichier.docx" pour pouvoir avoir une situation à peu près similaire à celle présentée sur le tutoriel. J'ai pris soin de placer ce fichier dans le dossier où se trouve l'exécutable (le dossier Debug), d'où l'absence de la partie "C:\" dans le path. L'application situe donc correctement le fichier.

    Et de toute façon, si elle ne trouvait pas le fichier, elle me générerait une erreur FileNotFoundException, testé et approuvé...

    Je ne comprends pas d'où cela pourrait venir...

  4. #4
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    Si on a la maitrise du fichier word, on peut utiliser la possibilité de publipostage de Word.

    Il suffit alors de relier le modèle de publipostage (fichier .doc ou .docx) à un fichier csv avec une seule ligne contenant toutes les valeurs variables à insérer dans le doc Word.

    En exécution, on recrée le fichier csv avec de nouvelles valeurs et on lance l'impression word :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    using (PrintDialog pd = new PrintDialog())
    {
      pd.ShowDialog();
      ProcessStartInfo info = new ProcessStartInfo(@"D:\documents\filetoprint.doc");
      info.Verb = "PrintTo";
      info.Arguments = pd.PrinterSettings.PrinterName;
      info.CreateNoWindow = true;
      info.WindowStyle = ProcessWindowStyle.Hidden;
      Process.Start(info);
    }
    " Le croquemitaine ! Aaaaaah ! Où ça ? " ©Homer Simpson

Discussions similaires

  1. Insérer un bloc de texte dans un document word
    Par bb_brown dans le forum VBA Word
    Réponses: 1
    Dernier message: 13/11/2009, 00h19
  2. Localiser du texte dans un document word avec java
    Par samorra dans le forum Débuter avec Java
    Réponses: 5
    Dernier message: 14/07/2009, 12h56
  3. Réponses: 0
    Dernier message: 15/03/2008, 09h59
  4. insertion de texte dans le document
    Par gangsterus dans le forum VBA Word
    Réponses: 2
    Dernier message: 26/12/2007, 14h34
  5. [VB6 - Word] Insertion d'entêtes dans un document Word
    Par tmcgrady dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 27/09/2006, 14h45

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo