Bonjour à tous,
Je me casse la tête sur le pilotage de word. Le sujet paraît pourtant assez simpliste :
Je lit un treeview dans mon application et je copie le contenu des noeuds dans un document word en faisant correspondre un style en fonction du niveau du noeud.
Pour chaque noeud, l'application cliente appelle la classe ExpertWord de mon assembly c#.
Exemple d'appel :
La méthode InsereParagraphe
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 public void JeuxEssaiStyle() { InsereParagraphe("Chapitre 1", "Titre 1"); InsereParagraphe("A-xxxxx", "Titre 2"); InsereParagraphe("aaaaa 1", "Normal"); InsereParagraphe("B-xxxxx", "Titre 2"); InsereParagraphe("aaaaa 2", "Normal"); InsereParagraphe("Chapitre 2", "Titre 1"); InsereParagraphe("A-xxxxx", "Titre 2"); InsereParagraphe("bbbb 1", "Normal"); InsereParagraphe("B-xxxxx", "Titre 2"); InsereParagraphe("bbbb 2", "Normal"); }
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 public void InsereParagraphe(string MonText, string NomStyle) { object LeStyle = NomStyle; object oMissing = System.Reflection.Missing.Value; // MessageBox.Show("InsertAfter", "InsereParagraphe", MessageBoxButtons.OK, MessageBoxIcon.Information); _MaSelection.InsertAfter(MonText); // MessageBox.Show("Set_Style " + NomStyle, "InsereParagraphe", MessageBoxButtons.OK, MessageBoxIcon.Information); try {_MaSelection.set_Style( ref LeStyle ); } catch (Exception E) { MessageBox.Show(E.Message, "InsereParagraphe", MessageBoxButtons.OK, MessageBoxIcon.Error); } // MessageBox.Show("InsertAfter LigneSuivante", "InsereParagraphe", MessageBoxButtons.OK, MessageBoxIcon.Information); _MaSelection.InsertAfter("\n"); }
A l'éxécution,
#msg# Insert after
Chapitre 1 est inséré
#msg# Set_Style Titre1
Chapitre 1 passe en titre 1
#msg# insérer ligne suivante
une nouvelle ligne en titre 1 est créé
#msg# Insert After
A-xxxxxx est inséré (le style est Titre 1)
#msg# Set_Style Titre2
Les 2 lignes de textes passent en Titre 2
#msg# insérer ligne suivante
une nouvelle ligne en titre 2 est créé
#msg# Insert After
aaaaa 1 est inséré (le style est Titre 2)
#msg# Set_Style Titre2
Les 3 lignes de textes passent en Normal
etc ...
Visiblement le problème vient de _MaSelection (de type Microsoft.Office.Interop.Word.Range) qui contient l'intégralité du texte envoyé.
_MaSelection est inialisé lors de la recherche du signet par la méthode suivante
Après l'ajout de la première ligne par InsereParagraphe, comment modifier _MaSelection pour que les lignes précédentes ne soit plus dedans ?
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 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(); _MaSelection = _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; } }
Merci pour votre aide
Partager