[Calc] Créer un diagramme de type ligne

Vos meilleures macros et portions de code sont publiées dans cette section.
Aucun support sur une question de programmation ici !

Modérateur : Vilains modOOs

Règles du forum
Aucune question dans cette section !
Celle-ci rassemble les meilleures macros et portions de code. Vous pouvez en revanche commenter ou argumenter le code exposé. Vous pouvez même remercier l'auteur (cela fait toujours plaisir) en indiquant par exemple dans quel cadre ou contexte vous en avez eu l'utilité.
Si vous avez à poster quelque chose, faites-le depuis la section Macros et API et demandez à un modérateur de l'y déplacer.
ThierryM
Membre enthOOusiaste
Membre enthOOusiaste
Messages : 439
Inscription : 26 nov. 2006 11:29
Localisation : Les Corbières

[Calc] Créer un diagramme de type ligne

Message par ThierryM »

Adieu a totes,
Suite à pas mal de recherches pour arriver à un résultat convenable, je vous joins un classeur permettant de créer uniquement par macro un diagramme de type "Ligne" car je trouve qu'on manque d'info pour ce genre de tâches.
Dans le fichier joint, vous trouverez sur la droite le diagramme que je veux obtenir par macro. À condition d'avoir installé l'extension XRay, il est possible d'obtenir les propriétés de ce graphique pour les utiliser dans la macro.
Sélection_076.png
Sur la gauche, on voit le graphique entièrement généré par la macro.

Sources utiles : Le code est commenté pour mieux le comprendre.
On voit aussi comment mettre en forme le diagramme.

Voici la macro :

Code : Tout sélectionner

Sub CreerGraphiqueLigne
' Macro attachée au bouton "Créer Graphique"
' Macro qui permet de créer un graphique de type ligne
	Dim monClasseur As Object, lesFeuilles As Object, graphiques As Object
    Dim rect As new com.sun.star.awt.Rectangle
	Dim source(1) As New com.sun.star.table.CellRangeAddress	
	
	monClasseur = ThisComponent
	lesFeuilles = monClasseur.Sheets
	
    'place le graphique dans la feuille	
    rect.X = 500				' position x sur la feuille
    rect.Y = 6500				' position y sur la feuille
    rect.Width = 16000 		' largeur du diagramme en 1/100 mm soit 16 cm ici
    rect.Height = 8000		' hauteur du diagramme en 1/100 mm soit 8 cm ici
    graphiques=lesFeuilles(0).Charts 
    source(0)=lesFeuilles(0).GetCellRangeByName("A3:K7").RangeAddress 'Plage contenant les données utiles au graphique
    graphiques.addNewByName("GraphiqueMacro", rect ,source(), false, false)

    newGraphique=graphiques.getByName("GraphiqueMacro").EmbeddedObject
     
  ' AJOUT DES SÉRIES
  oDataProvider = newGraphique.getDataProvider()
  oDiagram = newGraphique.getFirstDiagram()
  oCooSys = oDiagram.getCoordinateSystems()
  oCoods = oCooSys(0)
  oChartTypes = oCoods.getChartTypes()
  oChartType = oChartTypes(0)
  ' Toutes les séries de données du nouveau graphique
  oDataSeriesList = oChartType.getDataSeries()
  
  ' création des séries
  Dim oNewDataSeriesList(3) As Object ' sert à préparer la création de 4 nouvelles séries
  oSeries1 = CreateDataSeries_LineDiagram(oDataProvider, "Feuille1.B4:K4", "Feuille1.A4")
  oSeries2 = CreateDataSeries_LineDiagram(oDataProvider, "Feuille1.B5:K5", "Feuille1.A5")
  oSeries3 = CreateDataSeries_LineDiagram(oDataProvider, "Feuille1.B6:K6", "Feuille1.A6")
  oSeries4 = CreateDataSeries_LineDiagram(oDataProvider, "Feuille1.B7:K7", "Feuille1.A7")
       
  ' Fixe la couleur des lignes (séries)
 cRouge=RGB(255,0,0)		'Couleur ROUGE long=16711680   Hexadécimal = 00FF0000
 cJaune=RGB (255,255,0)	'Couleur JAUNE long=16776960   Hexadécimal = 00FFFF00
 cVert=RGB(0,169,51)  		'Couleur VERT=43315      Hexadécimal = 0000A933
 cBleu=RGB (42,96,143)		'Couleur BLEU long=2777231    Hexadécimal = 002A608F
 oSeries1.Color = cRouge
 oSeries2.Color = cJaune
 oSeries3.Color = cVert
 oSeries4.Color = cBleu
  
 ' mise à jour du nouveau graphique en y intégrant les séries
 oNewDataSeriesList(0) = oSeries1
 oNewDataSeriesList(1) = oSeries2
 oNewDataSeriesList(2) = oSeries3
 oNewDataSeriesList(3) = oSeries4
 'xray oNewDataSeriesList
 oChartType.setDataSeries(oNewDataSeriesList)  
    
 ' Création des étiquettes sur l'axe X
 xAxis = oCoods.getAxisByDimension(0,0)
 oScaledata = xAxis.ScaleData
 'oCat = oScaledata.Categories 'Utile pour récupérer les données en cas de mise à jour (ce n'est pas le cas ici pour une nouvelle création)
 'oPlageX = lesFeuilles(0).getCellRangeByName("B3:K3").RangeAddress 'Utile si l'on devait par exemple récupérer la plage pour une mise à jour
 sPlageX = lesFeuilles(0).getCellRangeByName("B3:K3").AbsoluteName 'Plage pour les données en X
 newValues = oDataProvider.createDataSequenceByRangeRepresentation(sPlageX)
 newValues.Role = "categories"
 newValues.SourceRangeRepresentation("Feuille1.B3:K3")
 newValues.IncludeHiddenCells = "True"
 newCat = CreateUnoService("com.sun.star.chart2.data.LabeledDataSequence")
 newCat.Values = newValues
 oScaledata.Categories = newCat
 xAxis.setScaleData(oScaledata)

 'Mise en forme finale (NE PAS LE FAIRE AVANT avant d'avoir peupler les dataseries !!!)
 xray newGraphique.Legend
 With newGraphique
 	.Diagram = newGraphique.createInstance("com.sun.star.chart.LineDiagram") 'Type de graphique : ici Line Diagram
 	.Diagram.Wall.Fillcolor=-1 'Couleur de fond du graphique (ici pas de couleur) Couleur grise par défaut
	.Diagram.Wall.LineColor = 11776947 'Couleur de la bordure du graphique
	.Diagram.Wall.LineStyle=1  'Type de trait de la bordure	: ici "continue"
	.Diagram.SplineType = 0 
	.Diagram.HasXAxisTitle = False
	'.Diagram.XAxisTiTle.string = "Journées"
	.Diagram.HasYAxisTitle = False
	'.Diagram.XAxisTiTle.CharHeight = 16
  	.Diagram.XAxis.CharHeight = 8
  	.Diagram.SymbolType =-2 ' permet d'avoir des symboles différents selon les séries, mettre -3 si on ne veut pas de symboles
    '.Diagram.SymbolType =com.sun.star.chart.ChartSymbolType.SYMBOL1 'Impose le symbole "carré"
	.HasMainTitle = True
	.Title.string = "Graphique des taux à la journée"
	.Title.CharHeight = 13
    .Area.LineWidth=80 'fixe la largeur des lignes en 1/100e mm
    .HasLegend=True 'Permet d'afficher la légende
    .Legend.FillColor=-1  'Couleur de fond de la légende (ici pas de couleur) Couleur grise par défaut
	.Legend.LineStyle=0 'Type de trait de la bordure de la légende	: ici "aucun"    
 End With
 
End Sub
Il est possible de se servir de ce classeur pour travailler, faire des recherches sur d'autres macro avec des types de diagrammes différents en changeant le "modèle".
En espérant que ça serve :wink: .
A lèu,

Thierry
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
LibreOffice Version: 24.8.4.2 / Linux Mint Mate Edition 21.3 / Pourquoi privilégier les formats de fichiers ouverts ?
Avatar de l’utilisateur
Dude
IdOOle de la suite
IdOOle de la suite
Messages : 25994
Inscription : 03 mars 2006 07:45
Localisation : 127.0.0.1

Re: [Calc] Créer un diagramme de type ligne

Message par Dude »

Salut,

En quelques lignes avec zBasic :)
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
ThierryM
Membre enthOOusiaste
Membre enthOOusiaste
Messages : 439
Inscription : 26 nov. 2006 11:29
Localisation : Les Corbières

Re: [Calc] Créer un diagramme de type ligne

Message par ThierryM »

Adieu @Dude,

Merci pour cette solution zBasic que je ne connaissais pas du tout.

Le bémol que j'apporterais dans le cas ici, c'est que ça me semble intéressant pour un classeur qui n'a pas vocation à être utilisé par d'autres et pour des cas assez simples.

"Mon public" est constitué de néophytes qui ne feront qu'utiliser le classeur sans aller voir les macros car ça nécessite d'installer une extension : ça peut paraître trivial pour nous mais ça rajoute une complication (déjà que changer le niveau de sécurité pour les macro...).

Le classeur que j'ai posté a été simplifié au maximum pour que le code le soit aussi afin de ne pas compliquer sa compréhension et ne correspond pas forcément à un cas réel : franchement pourquoi vouloir passer par des macro alors qu'au final ça serait beaucoup plus simple de le construire manuellement :wink: ?
Les plages de cellules ne sont pas forcément regroupées comme ici. Par exemple, j'ai eu besoin de cette macro pour obtenir 6 courbes dont les données étaient réparties sur 5 feuilles différentes avec 4 qui doivent être récupérées régulièrement en supprimant leurs anciennes feuilles (ce qui demande alors une regénération globale pour reconstituer les références sinon on se retrouve avec des erreurs $#REF! de partout dans les formules).

zBasic est séduisant vu l'apparente facilité que ça apporte mais ça demande aussi une certain apprentissage et personnellement je pense que c'est plus productif d'apprendre à programmer "nativement" dès le départ pour pouvoir ré-investir par la suite, sans passer par une sur-couche supplémentaire. Mais évidemment ça dépend de ce qui est recherché.

C'est vrai aussi qu'il manque dans les librairies ScriptForge des macro portant sur les diagrammes et que les ressources sur ces sujets sont très limitées à l'heure actuelle et que tout est bon à prendre :wink:.

Cordialement,

Thierry
LibreOffice Version: 24.8.4.2 / Linux Mint Mate Edition 21.3 / Pourquoi privilégier les formats de fichiers ouverts ?
Avatar de l’utilisateur
Bidouille
RespOOnsable forum
RespOOnsable forum
Messages : 12673
Inscription : 08 nov. 2005 16:23
Localisation : Brest, France

Re: [Calc] Créer un diagramme de type ligne

Message par Bidouille »

Bonjour,
ThierryM a écrit : 27 janv. 2025 10:51car ça nécessite d'installer une extension : ça peut paraître trivial
Vous devriez lire la FAQ sur son usage : https://beaussier.com/wiki/index.php?ti ... kezako_%3F
S'il y a d'autres questions, il vaut mieux les poster sur mon forum.

Merci de ne plus diverger du sujet initial qui est la création de diagramme de type ligne.