Bonjour à tous,
Bien que débutant je me suis lancé dans l'écriture, en C#, d'une application "Form" pour bureau Windows.
Son objet est, entre autre, de créer des documents Word à partir de modèles existants.
Grace à la fréquentation assidue du forum, j'ai réussi à faire ce que je souhaitais pour la création et l'enregistrement.
En revanche, je butte sur l'insertion des informations des TextBoxes du formulaire dans les signets Word préexistants ( qui sont au nombre de vingt à soixante selon les documents).
J'utilise une boucle "foreach" qui passe en revue les signets vierges du document et lit dans des listes les adresses des textes correspondant à y insérer.
Tout se passe bien mais les signets sont détruits ce qui ruine l'usage des champs REF qui est pourtant l'essentiel de l'automatisation du process.
J'ai bien essayé de les recréer dans la foulée mais là, le "forech" reboucle indéfiniment sur le même signet (le premier par ordre alphabétique)
J'ai beaucoup cherché sur le web et essayé de nombreuses combinaisons malheureusement sans succès.
Voici la partie du code défectueux, je l'ai commenté pour une lecture plus directe du problème.
Pouvez-vous m'aider ?
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 .... foreach (string mod in modeles)// BOUCLE d'appel DE CREATION DES DOCUMENTS à partir des modèles Word sélectionnés au " void ChoixDoc()" { modelDoc = mod; CreateDocFile(); } // fin de BOUCLE d'appel DE CREATION DES DOCUMENTS Word void CreateDocFile() // _____CREATION DE DOCUMENT Word .docx { Word.Application objWord = new Word.Application {Visible = false}; // connexion à Word object TemplateName = Path.Combine(ModelPath, modelDoc); // Chemin du fichier modèle choisi Word.Document newDoc = objWord.Documents.Add(ref TemplateName); //création d'un nouveau document d'après le modèle //remplissage des signets selon les listes préétablies foreach (Word.Bookmark signet in newDoc.Bookmarks) { string nomSignet = signet.Name; int indexB = Array.IndexOf(liste_Signet, nomSignet); // On récupére l'index du signet (liste de corrélation préétablie []) string textSignet = liste_Signet_Texte[indexB, 1]; //on récupère le texte de la textBox du formulaire correspondant au nom du signet (liste de corrélation 2D préétablie[,]) if (textSignet != "") { //object name = nomSignet; // -> //première méthode //Word.Range range = newDoc.Bookmarks.get_Item(ref name).Range; Word.Range range = newDoc.Bookmarks.get_Item(nomSignet).Range; // -> autre méthode sans passer par la ref name //Pas mieux pour la boucle range.Text = textSignet; //object newRange = range; // -> essai sans la ref newRange : même pb de foreach ! newDoc.Bookmarks.Add(nomSignet, range); /* Cette dernière instruction bloque la boucle foreach qui fonctionne sur le premier signet puis reboucle indéfiniement sur ce même signet sans passer au suivant. En revanche le texte premier signet est bien inséré et le signet recréé comme on l'attend. Si on commente cette instruction pour la sauter, la boucle fonctionne et tous les textes des signets sont insérés. Mais, les signets eux-mêmes disparaissent ce qui ruine le document qui en fait grand usage par l'intermédiaire de champs "REF". */ } //pour visualisation de déboguage MessageBox.Show("Avant rebouclage \nLe signet = " + nomSignet + " = ?signet.Name = " +signet.Name + "\n son texte est : " + textSignet); } //Attribution du nom de fichier à partir des listes de noms des modèles[] et des noms à attribuer[,] int indexF = Array.IndexOf(liste_modelDoc, modelDoc); string nomFichier = liste_Attribution_Nom [indexF,1]; string recapPath = Path.Combine(RepPath, nomFichier); object fileName = recapPath; newDoc.SaveAs2(ref fileName); // Enregistrement du document avec son nouveau nom newDoc.Close(); objWord.Quit(); } //______ fin de CREATION DE DOCUMENT Word .docx
Partager