Openxml word 2010/2007 comportement différent [Résolu]

Messages postés
642
Date d'inscription
mercredi 10 septembre 2008
Dernière intervention
9 février 2017
- - Dernière réponse : dodo7263
Messages postés
642
Date d'inscription
mercredi 10 septembre 2008
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
Afficher la suite 

Votre réponse

5 réponses

Messages postés
642
Date d'inscription
mercredi 10 septembre 2008
Dernière intervention
9 février 2017
0
Merci
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#.
Commenter la réponse de dodo7263
Messages postés
12409
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
17 décembre 2018
0
Merci
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
Commenter la réponse de Whismeril
Messages postés
642
Date d'inscription
mercredi 10 septembre 2008
Dernière intervention
9 février 2017
0
Merci
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
Commenter la réponse de dodo7263
Messages postés
642
Date d'inscription
mercredi 10 septembre 2008
Dernière intervention
9 février 2017
0
Merci
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
Whismeril
Messages postés
12409
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
17 décembre 2018
-
Connais pas openXML, désolé
Commenter la réponse de dodo7263
Messages postés
642
Date d'inscription
mercredi 10 septembre 2008
Dernière intervention
9 février 2017
0
Merci
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"
Commenter la réponse de dodo7263

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.