Pb C# Word lire DOCPROPERTY

patatasux Messages postés 18 Date d'inscription lundi 11 janvier 2010 Statut Membre Dernière intervention 21 mai 2010 - 20 avril 2010 à 15:30
nhervagault Messages postés 6063 Date d'inscription dimanche 13 avril 2003 Statut Membre Dernière intervention 15 juillet 2011 - 21 avril 2010 à 18:47
Bonjours,

j'ai besoin pour mon stage de lire un fichier word, mais d'une manière pas très normale:

voici un extrait du word:

Contrat entre

ClinCli

et

MedFour


dans une autre vue (codes de champs), cela donne :

{DOCPROPERTY TYPE \* MERGEFORMAT}entre

{DOCPROPERTY PURCHASER \* MERGEFORMAT} et

...


bref ce fichier word inclue d'autre fichiers word.

Ce que je voudrai c'est lire les "{DOCPROPERTY TYPE \* MERGEFORMAT}" et non le texte qui est inclu.

voila ce que j'ai essayé, mais qui ne marche pas :/

 Word.Application app = new Word.ApplicationClass();
            app.Visible = true;
            object nullobj = System.Reflection.Missing.Value;
            object file = @"plopplopplopplopplop";
            Word.Document doc = app.Documents.Open( ref file, ref nullobj, ref nullobj, ref nullobj,ref nullobj, ref nullobj, ref nullobj, ref nullobj,ref nullobj, ref nullobj, ref nullobj, ref nullobj,ref nullobj, ref nullobj, ref nullobj,ref nullobj);
            
            doc.ActiveWindow.Selection.WholeStory();
            doc.ActiveWindow.View.ShowFieldCodes = true; //je me met dans la vue pour voir les includes

            doc.ActiveWindow.Selection.Copy();
            string text = Clipboard.GetText();
            richTextBox1.Text=text;
            
            doc.Close(ref nullobj, ref nullobj, ref nullobj);
            app.Quit(ref nullobj, ref nullobj, ref nullobj);


bien évidement, ce qui est affiché dans le richTextBox, c'est le texte inclu, non les balises.

Comme je ne sais pas si j'ai été très clair, je me résume :D
- je lis un fichier word dont le texte est inclu à partir d'autres fichiers word
- je voudrai obtenir les balises word comme: {DOCPROPERTY TYPE \* MERGEFORMAT}
- mais je n'obtient que du texte

Une petite observation: même à la main, lorsque je fais copier coller en vue code de champs, le texte copié est le texte inclu (pas les balises)

Merci d'avance pour le coup de pouce.

3 réponses

nhervagault Messages postés 6063 Date d'inscription dimanche 13 avril 2003 Statut Membre Dernière intervention 15 juillet 2011 36
20 avril 2010 à 22:35
Salut,


Ce lien doit t'aider. Il faut utiliser les fields des document word.

http://www.c-sharpcorner.com/UploadFile/amrish_deep/WordAutomation05102007223934PM/WordAutomation.aspx

N'hésites pas à poster ton code une fois le problème résolu voir en faire une source.

Bon dev.
patatasux Messages postés 18 Date d'inscription lundi 11 janvier 2010 Statut Membre Dernière intervention 21 mai 2010
21 avril 2010 à 11:24
merci bien, je suis allé voir, et ca m'a dépanné, j'ai pas encore tout creusé, mais ca devrai aboutir.

Etant donné que je travail pr une entreprise, donner le code source final ne sera pas possible, en revanche, si qqn tombe la dessus et qu'il a le même pb, je px fournir mon petit programme de test qui affiche tout les includes dans un panel.

            Word.Application app = new Word.ApplicationClass();
            app.Visible = true;
            object nullobj = System.Reflection.Missing.Value;
            object file = @"E:\stage\Current\CobuProjects\UserProjectA\Output\_Main.doc";
            Word.Document doc = app.Documents.Open( ref file, ref nullobj, ref nullobj, ref nullobj,ref nullobj, ref nullobj, ref nullobj, ref nullobj,ref nullobj, ref nullobj, ref nullobj, ref nullobj,ref nullobj, ref nullobj, ref nullobj,ref nullobj);
            
            System.Windows.Forms.Label labelTemp = new System.Windows.Forms.Label();
            labelTemp.Location = new System.Drawing.Point(0, 0);
            labelTemp.Name = "label1";
            labelTemp.AutoSize = true;
            labelTemp.TabIndex = 1;
            labelTemp.Text = "plop";
            this.panel1.Controls.Add(labelTemp);

            foreach (Word.Field myMergeField in doc.Fields)
            {
                Word.Range rngFieldCode = myMergeField.Code;
                String fieldText = rngFieldCode.Text;

                    labelTemp = new System.Windows.Forms.Label();

                    labelTemp.AutoSize = true;
                    labelTemp.Location = new System.Drawing.Point(0, this.panel1.Controls[this.panel1.Controls.Count - 1].Location.Y + this.panel1.Controls[this.panel1.Controls.Count - 1].Height);
                    labelTemp.Name = "label1";
                    labelTemp.AutoSize = true;
                    //labelTemp.Size = new System.Drawing.Size(35, 13);
                    labelTemp.TabIndex = 1;
                    labelTemp.Text = "label1";

                    labelTemp.Text = fieldText;

                    this.panel1.Controls.Add(labelTemp);
            }

            
            doc.Close(ref nullobj, ref nullobj, ref nullobj);
            app.Quit(ref nullobj, ref nullobj, ref nullobj);


cette méthode permet d'obtenir tout les includes, malheureusement, cela ne se fait pas en parallèle avec le texte non inclu. (soit on a le texte, soit les include)

Je repasserai sans doute poster une suite qd cela aura avancé.
nhervagault Messages postés 6063 Date d'inscription dimanche 13 avril 2003 Statut Membre Dernière intervention 15 juillet 2011 36
21 avril 2010 à 18:47
Merci,

Je demandais pas le code total, mais juste un ptit programme normal ;-)
Rejoignez-nous