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)

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
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).

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

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
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.
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!