Bonjour à tous,
Je bloque sur ce souci depuis hier matin et je commence à plus avoir les idées claires du tout, donc si quelqu'un pouvait m'éclairer ce serait sympa.
Donc j'expose le bouzin:
J'ai un formulaire assez complexe (composé d'onglets, d'onglets dans des onglets, de groupbox, panels et toute la compagnie). A partir de ce formulaire et des saisies utilisateur, j'ai créé une chaine de type String se composant comme ça:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 Partie Sous-Partie Nom du champ: valeur ...
Dont voici le code (il fonctionne, aucun souci majeur dessus)
A partir de cette chaine, qui, vous l'aurez remarqué, est composée de balises, je voudrais générer un document word. Celles-ci devraient permettre de mettre en gras, italique ou souligner certains passages (comme si on utilisait word donc).
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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90 Private Sub recapTechnique(ByVal from As Control) Dim cpt As Integer = 0 If TypeOf from Is Form Then str = Nothing str += "<strong>" & from.Text & vbNewLine & "</strong>" Else If Not TypeOf from Is TabControl Then Dim parent As Control = from.Parent While Not TypeOf parent Is Form parent = parent.Parent str += vbTab cpt += 1 End While Select Case from.GetType.Name Case "TabPage" str += "<strong>" & from.Text & vbNewLine & "</strong>" Case "GroupBox" str += "<i>" & from.Text & vbNewLine & "</i>" Case Else str += from.Text & vbNewLine End Select End If End If For Each cont In from.Controls If TypeOf cont Is GroupBox Or TypeOf cont Is TabPage Or TypeOf cont Is Panel Or TypeOf cont Is TabControl Then recapTechnique(cont) Else If Not TypeOf cont Is Label And Not TypeOf cont Is Button Then If TypeOf cont Is ComboBox Then If Not cont.Text = "" Then For i = 0 To cpt str += vbTab Next If Not IsNothing(cont.Parent.Controls("lab" & cont.Name)) Then str += "<souligne>" & cont.Parent.Controls("lab" & cont.Name).Text & "</souligne>" & " :" & cont.Text & vbNewLine Else If TypeOf cont.Parent Is Label Then str += "<souligne>" & cont.Parent.Controls("lab" & cont.Parent.Name).Text & "</souligne>" & " :" & cont.Text & vbNewLine Else str += cont.Text & vbNewLine End If End If End If Else If TypeOf cont Is RadioButton Or TypeOf cont Is CheckBox Then If cont.checked Then For i = 0 To cpt str += vbTab Next If Not IsNothing(cont.Parent.Controls("lab" & cont.Name)) Then str += "<souligne>" & cont.Parent.Controls("lab" & cont.Name).Text & "</souligne>" & " :" & cont.Text & vbNewLine Else If TypeOf cont.Parent Is Label Then str += "<souligne>" & cont.Parent.Controls("lab" & cont.Parent.Name).Text & "</souligne>" & " :" & cont.Text & vbNewLine Else str += cont.Text & vbNewLine End If End If End If Else If TypeOf cont Is TextBox Then If Not cont.Text = "" Then Dim formatageTxt As String Dim passageLigne As String = Nothing For i = 0 To cpt passageLigne += vbTab str += vbTab Next cont.Text = cont.Text.ToString.Replace(Chr(10), Chr(10) & passageLigne) If Not IsNothing(cont.Parent.Controls("lab" & cont.Name)) Then str += "<souligne>" & cont.Parent.Controls("lab" & cont.Name).Text & "</souligne>" & " :" & cont.Text & vbNewLine Else If TypeOf cont.Parent Is Label Then str += "<souligne>" & cont.Parent.Controls("lab" & cont.Parent.Name).Text & "</souligne>" & " :" & cont.Text & vbNewLine Else str += cont.Text & vbNewLine End If End If End If End If End If End If End If End If Next End Sub
J'ai donc écrit une autre méthode permettant de recopier en formattant le texte. J'ai fait au plus simple d'abord (gestion d'une seule balise). Aucune souci particulier
Voici le code
Donc le rendu actuel est ok pour la mise en gras. L'indentation reste et le texte que je veux en gras l'est bien.
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 Private Sub gestionWord(ByVal text As String) doc = New Word.Document Dim cptLettres As Integer = 0 doc = objWord.Documents.Add() For i = 0 To text.Length - 1 'où se trouve la balise de commencement Dim commencementStrong = text.IndexOf("<strong>", i) Dim finStrong, longueurEntreBalise, indexCommencement As Integer 'si il y a bien un commencement et une fin If commencementStrong >= 0 Then 'où se trouve la balise de fermeture finStrong = text.IndexOf("</strong>", commencementStrong) 'index début balise + longueur de la balise indexCommencement = commencementStrong + "<strong>".Length 'index début de la balise de fin + fin de la balise de début longueurEntreBalise = finStrong - indexCommencement doc.ActiveWindow.Selection.TypeText(text.Substring(i, commencementStrong - i)) doc.ActiveWindow.Selection.Font.Bold = True 'on prend cette partie du texte, le colle doc.ActiveWindow.Selection.TypeText(text.Substring(indexCommencement, longueurEntreBalise)) cptLettres += longueurEntreBalise 'reset des types de police doc.ActiveWindow.Selection.Font.Bold = False Else ''si il reste quand même des balises dans le texte Dim autreBalise = text.IndexOf("<", i) If autreBalise <> -1 Then 'on prend la partie avant la balise et on la colle sans type de police doc.ActiveWindow.Selection.TypeText(text.ToString.Substring(i, autreBalise - i)) i = autreBalise Else doc.ActiveWindow.Selection.TypeText(text.Substring(i, text.Length - i)) Exit For End If 'sinon, c'est que les balises sont finies, donc on colle le reste du texte 'End If 'debugl += "Suite balise: " & autreBalise End If If finStrong > i Then i = finStrong + "<strong>".Length + 1 End If Next End Sub
Problème: Adapter la fonction pour gérer plusieurs balises. Étant donné, qu'à ma connaissance, on ne peut pas baliser le texte de sorte que word reconnaisse les passages dont le texte a un traitement particulier, il faut coller des morceaux de textes un à un.
Le souci intervient avec les imbrications de balises surtout.
Un texte composé de <strong> machin truc <i> bidule </i> </strong> est plus compliqué à gérer étant donné qu'il faudra d'abord coller le "machin truc" en gras, puis le "bidule" en gras + italique.
Bref, j'ai testé pas mal de choses qui n'ont pas donné du tout le résultat recherché.
Je pense qu'il faut parcourir le texte, repérer la première balise, prendre le texte intérieur, y mettre un booléen, parcourir le texte à l'intérieur, testé si il y a une balise etc etc.
Vu la logique, j'ai pensé à du récursif, mais je n'ai pas encore réussi à le faire.
Je pourrais aussi stocker tous les indices des textes balisés, lettre à lettre mais bon ça ferait une fonction à 53454534^10 tests...
Merci de passer par ici!
Partager