Openxml word 2010/2007 comportement différent

Résolu
dodo7263 Messages postés 614 Date d'inscription mercredi 10 septembre 2008 Statut Membre Dernière intervention 9 février 2017 - 30 juil. 2013 à 08:50
dodo7263 Messages postés 614 Date d'inscription mercredi 10 septembre 2008 Statut Membre Dernière intervention 9 février 2017 - 1 août 2013 à 09:34
Bonjour,

Depuis hier, j'essaie de remplir un document word (2007 et 2010) à l'aide de signets positionnés et de c# bien entendu. J'utilise les API openXML (au passage que je trouve puissante) et pour cela voici le code utilisé :

public static void AddTextToBookmark(string fileName, string textToAdd)
        {
            IDictionary<String, BookmarkStart> bookmarkMap = new Dictionary<String, BookmarkStart>();
            using (var document = WordprocessingDocument.Open(fileName, true))
            {
                var doc = document.MainDocumentPart;
                foreach (BookmarkStart bookmarkStart in doc.RootElement.Descendants<BookmarkStart>())
                {
                    bookmarkMap[bookmarkStart.Name] = bookmarkStart;
                }
                foreach (BookmarkStart bookmarkStart in bookmarkMap.Values)
                {
                    if (bookmarkStart.Name == "date")
                    {
                        Text text = new Text(textToAdd);
                        Run run = new Run(new RunProperties(new Bold()));
                        run.Append(text);
                        bookmarkStart.InsertAfterSelf(run);//.InsertAfterSelf(run);
                    }

                }
                doc.Document.Save();
            }


Le plus fabuleux, c'est que cela fonctionne parfaitement bien avec word 2007 mais word 2010 il m'est impossible de rajouter le texte au niveau du signet dans le document ????
Je ne suis pas spécialiste de word mais quelqu'un sait peut être pourquoi ce code se comporte différemment entre les 2 versions word ?

@++

SD

5 réponses

dodo7263 Messages postés 614 Date d'inscription mercredi 10 septembre 2008 Statut Membre Dernière intervention 9 février 2017 6
Modifié par dodo7263 le 30/07/2013 à 10:33
Pour plus de précision, Mon fichier word est en fait constituer de zone de texte dans lesquelles j'insère des signets qui seront remplis via mon application c#.
0
Whismeril Messages postés 19026 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 20 avril 2024 656
30 juil. 2013 à 23:25
Bonsoir, j'ai une source avec laquelle j'écris à la suite de signets dans word, mais je n'ai jamais essayé dans des zones de textes.
http://codes-sources.commentcamarche.net/source/51010-piloter-word-via-microsoft-office-interop-word
0
dodo7263 Messages postés 614 Date d'inscription mercredi 10 septembre 2008 Statut Membre Dernière intervention 9 février 2017 6
31 juil. 2013 à 13:37
Bonjour,

J'ai regardé avec openXML tool et je n'ai vu aucune différence significative.
Alors voici les nouvelles. Je pense que j'ai trouvé mon soucis mais fallait aller le chercher celui la.
En fait dans la liste des signets que je récupère dans la variable de mon code du premier message, il y a un signet caché avec pour nom _GoBack.
Du coup je ne rentre jamais dans ma boucle if :


if (bookmarkStart.Name == bookMarkName)
{
Text text = new Text(textToAdd);
Run run = new Run(new RunProperties(new Bold()));
run.Append(text);
bookmarkStart.Parent.InsertAfterSelf(run);
}


Je ne sais pas du tout d'où il sort ce signet. Je vais aller à la pêche aux réponses sur google. Toujours est il que sur word 2007, ce signet caché n'existe pas.
Si vous avez rencontré ce problème dites le moi ?

@++

SD
0
dodo7263 Messages postés 614 Date d'inscription mercredi 10 septembre 2008 Statut Membre Dernière intervention 9 février 2017 6
31 juil. 2013 à 19:29
Merci wishmeril pour ta source que je conais déjà par coeur ;-)

Je préfère utiliser openXML vu que je travaille avec word 2007 et/ou 2010. un SDK beaucoup plus puissant mais pas simple à prendre en main. En revanche quand tu as compris le truc ben c'est que du bonheur.

Bon, je pensais que j'aurais réglé mon problème mais pas du tout en fait.
J'ai l'impression que dans word 2010 du moment que j'insère un signet dans une zone de texte ben je peux pas l'écrire via mon application c#.
En revanche, si je ne mets aucune zone de texte ben ça fonctionne sous word 2010. Et sous word 2007 ça fonctionne tout le temps en fait.
Incompatibilité entre word 2007 et word 2010 ?

Si quelqu'un a déjà réussi à remplir un signet dans une zone de texte sous word 2010 et avec c#, je suis preneur car j'ai tout regardé.

Je vais me concentrer sur word 2007 puisque ça fonctionne bien.

@++

SD
0
Whismeril Messages postés 19026 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 20 avril 2024 656
31 juil. 2013 à 20:33
Connais pas openXML, désolé
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
dodo7263 Messages postés 614 Date d'inscription mercredi 10 septembre 2008 Statut Membre Dernière intervention 9 février 2017 6
Modifié par dodo7263 le 1/08/2013 à 09:35
Bonjour à tous,

Bon ben en fait, j'ai résolu mon problème. Je vous donne la solution avec quelques explications (merci chamamo !) pour ceux qui voudrait se lancer dans le openXML.

Pour insérer un texte il faut passer par le paragraphe parent, l'idée est de parcourir les paragraphes du document, ensuite pour chaque paragraphe on récupère les bookmarkStarts et bookmarkEnds (un bookmark a un début et une fin), une fois le bookmark trouvé on insère le texte dans le paragraphe courant juste avant le bookmarkEnd, voici la fonction:

public static void AddTextToBookmark1(string fileName, string textToAdd)
        {
            using (var document = WordprocessingDocument.Open(fileName, true))
            {
                var doc = document.MainDocumentPart;
                var body = doc.Document.GetFirstChild<Body>();
                //Récupérer tous les paragraphes du document, il ne faut pas utiliser Elements 
                //car cette méthode ne récupère pas les paragraphes contenus dans des textes par exemple ou autre chose
                var paras = body.Descendants<Paragraph>();
 
                foreach (var para in paras)
                {
                    //Pour chaque paragraphe on récupère les bookMarks (les débuts et les fins)
                    var bookMarkStarts = para.Elements<BookmarkStart>();
                    var bookMarkEnds = para.Elements<BookmarkEnd>();
                    foreach (var bookMarkStart in bookMarkStarts)
                    {
                        if (bookMarkStart.Name == "date")
                        {
                            //Récupérer l'id du bookMarkStart pour pouvoir récupérer le bookMarkFin correspondant
                            var id = bookMarkStart.Id.Value;
                            var bookmarkEnd = bookMarkEnds.First(i => i.Id.Value == id);
                            var text = new Text(textToAdd);
                            var run = new Run(new RunProperties(new Bold()));
                            run.Append(text);
                            //Insérer le run juste avant la balise bookMarkEnd
                            para.InsertBefore(run, bookmarkEnd);
                        }
                    }
                }
                doc.Document.Save();
            }
        }


Bon il y a quand même un détail qui me chiffonne c'est que le code que j'ai posté dans mon tout premier message fait exactement ce que je veux tout comme celui cité dans ce message mais en office 2007 seulement.

@++

SD


"La censure épargne les corbeaux et s'acharne sur les colombes" Juvenal
"La tolérance est une vertu qui rend la paix possible" K.Annan
"Pourquoi Windows ? Parce que Linux ou l'inverse peut-être"
0
Rejoignez-nous