code complet : Sub CreateReportFromDictionary(Dict As Object, oDoc As Object, sPath As String)
' Initialiser le texte du document
Dim oText As Object
oText = oDoc.getText()
Dim oCursor As Object
oCursor = oText.createTextCursor()
oCursor.gotoEnd(False) ' Déplacer le curseur à la fin du document
' Définir les catégories et leurs clés correspondantes
Dim categories(1) As String
categories(0) = "Régions"
categories(1) = "Départements"
Dim ficheActuelles(1) As String
ficheActuelles(0) = "RegActuelle"
ficheActuelles(1) = "DeptActuelle"
Dim fichePrevs(1) As String
fichePrevs(0) = "RegPrev"
fichePrevs(1) = "DeptPrev"
'compteur pour noms de graphiques uniques
Dim chartCounter As integer
chartCounter = 0
'Initialisation d ela plage des cellules
Dim mRanges(0) As New com.sun.star.table.CellRangeAddress
Dim k As Integer
For k = 0 To UBound(categories)
Dim category As String
category = categories(k)
Dim ficheActuelle As String
ficheActuelle = ficheActuelles(k)
Dim fichePrev As String
fichePrev = fichePrevs(k)
'MsgBox "j'affiche " & ficheActuelle & " et aussi " & fichePrev
' Vérifier si les données pour la catégorie actuelle existent
If Dict.Exists(ficheActuelle) or Dict.Exists(fichePrev) Then
'MsgBox "jjerjejj"
' Ajouter un titre en gras pour chaque catégorie
oText.insertString(oCursor, "Traitement CA des " & category & " : " & Chr(13), False)
oCursor.CharWeight = com.sun.star.awt.FontWeight.BOLD
oText.insertString(oCursor, Chr(13), False) ' Ligne vide après le titre
oCursor.CharWeight = com.sun.star.awt.FontWeight.NORMAL ' Réinitialiser la police normale
’ Déterminer le nombre d’entrées (régions ou départements,une pour les en-têtes et une par région) et 4 colonnes
Dim nbEntries As Integer
If Dict.Exists(ficheActuelle) Then
nbEntries = Dict.Item(ficheActuelle).Count
ElseIf Dict.Exists(fichePrev) Then
nbEntries = Dict.Item(fichePrev).Count
Else
nbEntries = 0
End If
’ Ajouter une ligne vide avant le nouveau tableau
oText.insertString(oCursor, Chr(13), False)
Dim oTable As Object
oTable = oDoc.createInstance(“com.sun.star.text.TextTable”)
oTable.initialize(nbEntries + 2, 4) ’ +2 pour la ligne de titre et les en-têtes
oText.insertTextContent(oCursor, oTable, False)
’ Fusionner la première ligne pour le titre
'oTable.getCellRangeByName(“A1:D1”).merge(True)
oTable.getCellByName(“A1”).setString(“Chiffres d’affaires (en périodes d’affaires)”)
' Remplir les en-têtes du tableau
oTable.getCellByName("A2").setString("Nom des " & category)
oTable.getCellByName("B2").setString("Cumul T précédente")
oTable.getCellByName("C2").setString("Cumul T actuelle")
oTable.getCellByName("D2").setString("Évolution (T précédente/T actuelle)")
' Parcourir le dictionnaire et remplir les données
Dim keys As Variant
If Dict.Exists(ficheActuelle) Then
keys = Dict.Item(ficheActuelle).Keys
Else
keys = Dict.Item(fichePrev).Keys
End If
Dim i As Integer
For i = LBound(keys) To UBound(keys)
Dim entry As String
entry = keys(i)
Dim ActuelleData As Variant
Dim PrevData As Variant
Dim cumulActuelle As Double
Dim cumulPrecedente As Double
Dim evolution As Double
' Initialiser les valeurs à vide
cumulActuelle = 0
cumulPrecedente = 0
evolution = 0
' Récupérer les données actuelles et précédentes si elles existent
If Dict.Exists(ficheActuelle) Then
If Dict.Item(ficheActuelle).Exists(entry) Then
ActuelleData = Dict.Item(ficheActuelle).Item(entry)
cumulActuelle = ActuelleData(0)
End If
End If
If Dict.Exists(fichePrev) Then
If Dict.Item(fichePrev).Exists(entry) Then
PrevData = Dict.Item(fichePrev).Item(entry)
cumulPrecedente = PrevData(0)
End If
End If
' Calculer l'évolution uniquement si les deux valeurs sont présentes et non nulles
If cumulActuelle <> 0 And cumulPrecedente <> 0 Then
evolution = ((cumulActuelle - cumulPrecedente) / cumulPrecedente) * 100
Else
evolution = 0
End If
oTable.getCellByName("A" & (i + 3)).setString(entry)
If cumulPrecedente <> 0 Then
oTable.getCellByName("B" & (i + 3)).setValue(cumulPrecedente)
End If
If cumulActuelle <> 0 Then
oTable.getCellByName("C" & (i + 3)).setValue(cumulActuelle)
End If
oTable.getCellByName("D" & (i + 3)).setValue(evolution)
Next i
' Créer un nouveau document Calc
Dim oCalcDoc As Object
oCalcDoc = StarDesktop.loadComponentFromURL("private:factory/scalc", "_blank", 0, Array())
' Ajouter des données dans le document Calc
Dim oSheet As Object
oSheet = oCalcDoc.getSheets().getByIndex(0)
oSheet.getCellRangeByName("A1").setString("Nom des " & category)
oSheet.getCellRangeByName("B1").setString("Évolution (T précédente/T actuelle)")
' Remplir les données dans Calc
For i = LBound(keys) To UBound(keys)
entry = keys(i)
evolution = oTable.getCellByName("D" & (i + 3)).getValue()
oSheet.getCellByPosition(0, i + 1).setString(entry)
oSheet.getCellByPosition(1, i + 1).setValue(evolution)
Next i
' Insérer un graphique dans Calc
Dim oCharts As Object
oCharts = oSheet.getCharts()
' Définir la plage de cellules pour le graphique
'Dim mRanges(0) As New com.sun.star.table.CellRangeAddress
mRanges(0).Sheet = 0
mRanges(0).StartColumn = 0 'Colonne A
mRanges(0).StartRow = 0 'On peut commencer à 1 pour enlever les entêtes
mRanges(0).EndColumn = 1 'Colonne B
mRanges(0).EndRow = nbEntries 'Ou + 1 à voir
' Définir la position et la taille du graphique
Dim rec As New com.sun.star.awt.Rectangle
rec.X = 1000
rec.Y = 1000
rec.Width = 15000
rec.Height = 10000
' Ajouter le graphique
chartCounter = chartCounter + 1
oCharts.addNewByName("Chart_" & chartCounter, rec, mRanges, True, True)
Dim oChart As Object
oChart = oCharts.getByName("Chart_" & chartCounter).getEmbeddedObject()
' Configurer le diagramme en barres horizontales
oChart.Diagram = oChart.createInstance("com.sun.star.chart.BarDiagram")
oChart.Diagram.Vertical = True
' Ajouter une légende au graphique
oChart.HasLegend = True
' Définir sa position en bas
oChart.Legend.Alignment = com.sun.star.chart.ChartLegendPosition.BOTTOM
' Sauvegarder le graphique comme image
Dim oGraphicExporter As Object
oGraphicExporter = CreateUnoService("com.sun.star.drawing.GraphicExportFilter")
Dim args(2) As New com.sun.star.beans.PropertyValue
Dim oPage As Object
oPage = oCalcDoc.drawPages.getByIndex(0)
oChart = oPage.getByIndex(0)
Sauvegarder comme un png
args(0).Name = "MediaType"
args(0).Value = "image/png"
'Configurer l'url
args(1).Name = "URL"
args(1).Value = ConvertToURL(sPath & "/tempChart" & chartCounter & ".png")
'Exporter le graphique
oGraphicExporter.setSourceDocument(oChart)
oGraphicExporter.filter(args())
' Insérer une ligne vide avant le graphique
oCursor.gotoEnd(False)
oText.insertString(oCursor, Chr(13), False)
' Insérer l'image dans le document Writer
Dim oGraphic As Object
oGraphic = oDoc.createInstance("com.sun.star.text.TextGraphicObject")
oGraphic.GraphicURL = ConvertToURL(sPath & "/tempChart" & chartCounter & ".png")
oText.insertTextContent(oCursor, oGraphic, False)
'Libérer explicitement les objets pour éviter les conflits de ressources
oChart = Nothing
oLegend = Nothing
oGraphicExporter = Nothing
' Fermer le document Calc sans sauvegarder
oCalcDoc.close(True)
wait 100
End If
'oText.insertString(oCursor, "Traitement des CA impossible car il manque soit des " & category & " : " & Chr(13), False)
'End If
Next k
' Enregistrer le document Writer
Dim sSaveURL As String
sSaveURL = ConvertToURL(sPath & "/Restitutions_graphiques/document_writer_trimestre.odt")
oDoc.storeAsURL(sSaveURL, Array())
MsgBox "Le rapport a été créé et enregistré avec succès."
End Sub