Writer : changer plage de graphique par macro

bonjour,

dans un document Writer j’ai une table et un graphique. J’informe les données du tableau par macro, et ça j’ai fait et ça marche. Puis je veux changer la plage de données du graphique par macro, en fonction des données des données (lignes/colonnes).

je n’ai pas trouvé comment accéder à l’objet “graphique” et, par conséquent, à la plage de données non plus !

merci de votre attention,
Philippe

Bonjour @philippelévi

Je montre comment accéder aux propriétés dans cette fiche sur notre wiki.

Cordialement

bonjour,

merci de votre retour. maintenant je vais devoir étudier la chose !! :slight_smile:

je pensais qu’il pourrait exister pour les graphiques quelque chose comme il existe pour les tables (que je n’ai pas trouvé), soit:

tableaux = document.getTextTables()
tableau = tableaux.getByName(nomTableau)

je vais essayer de comprendre comment utiliser votre code! merci encore !

mais je rappelle que table et graphique se trouvent dans un document WRITER ! (les données initiales proviennent d’une feuille CALC, je les copie dans la table WRITER et je veux ensuite juste changer la plage du graphique WRITER car les nbres de lignes et colonnes peuvent varier)
votre exemple semble pour un document CALC !
Philippe

Première ligne de la fiche :

Le programme présenté ici a pour objet de récupérer la table de données source d’un diagramme incorporé dans un document (writer par exemple)

:slight_smile:

je comprends mieux … mais je ne vois pas bien quand même !

vous récupérez les données … je veux changer la description de la plage !

Ah oui, désolé, j’avais lu un peu vite…

Ci-joint un exemple vite fait fondé sur l’exemple du wiki. Le document contient deux boutons permettant de changer la source de la première série : soit “contrebasse”, soit “concertina”.

Tu verras que ce n’est pas simple… Je pense que le mieux serait de recréer le graphique à chaque fois.

ModifSourceDiagramme.odt (22,7 Ko)

Cordialement

salut,
Recréer le diagramme … 1) je n’apprends rien ! 2) cela oblige l’utilisatrice à reconfigurer le diagramme à chaque fois …
sinon, comme les données viennent d’un tableur, elle pourrait aussi tout faire manuellement (créer le document Writer, créer le tableau, copier les données etc) ! … ça manque de charme ! :slight_smile:

j’ai jeté un oeil à la solution : sauf erreur de ma part, cela semble un peu la même chose que la précédente. c-a-d que cela ne connecte pas le graphique à la plage du tableau! cela copie les données dans le tableau. Mais c’est plus complet quand même !

	with oDiag.DataSequences(1)
		.setLabel(newseqLabel.label)
		.setValues(newseqValues.values)
	end with

si ce n’est pas abuser: pouvez-vous me passer le lien pour la wiki correspondante (où je peux trouver les outils, objets et méthodes, d’accès aux tableaux et graphiques sous Writer) ? losrque je fais des recherche cela n’apparaît jamais ! merci d’avance !

merci beaucoup, quand ça marche je publieirai ici la solution ! :slight_smile:
Philippe

PS excusez-moi … je viens de modifier le message! à la première lecture de la macro je n’avais pas compris la manoeuvre qui consiste à copier les données du tableau vers le graphique.

puis

Du coup je ne suis pas sûr de ce que tu as compris : la macro ne fait pas que copier les données, elle connecte (selon ton expression) la série à la plage, comme l’indique le nom createDataSequenceByRangeRepresentation.
Si tu modifies manuellement les données, la modification est répercutée sur le diagramme.

À ma connaissance il n’y a pas de page spécifique sur ce point.

La section macro du wiki regroupe l’essentiel des ressources disponibles. Parmi celles-ci tu ne peux faire l’impasse sur l’outil MRI. C’est ce dernier que j’ai utilisé pour trouver comment procéder.

vraiment merci pour votre attention,

je vais étudier et tester la macro ! :frowning: … je dois avouer que j’avais (mal) compris que les lignes que j’ai passées semblaient insérer les données dans le graphique, ce qui n’allait pas dans le sens de lier le graphique aux données du tableau !

MRI … ou XRay … j’ai du mal à utiliser ! je ne trouve jamais ce que j’y cherche ! je tombe sur des objets qui sont manipulés par des services uno dont je ne trouve pas la description des paramêtres !! :frowning:

merci encore de votre patience !
Philippe

en passant …

quand j’ouvre votre document ModifSourceDiagram.odt et que j’éditer le diagram, puis regarde la plage j’obtiens ceci (valeur erronnée dans la description de la plage)

il se produit la même chose avec votre configuration ? (j’ai testé sur une autre configuration et j’ai bien reproduit le problème).

cette erreur n’empêche pas fonctionner normalement!

j’avais repéré cette erreur avec mon document. j’ai donc ouvert un bug report hier.

bonne journée
Philippe

je pense que le sujet est résolu !!

enfin … presque ! revu, testé votre macro.

ce dont j’ai besoin c’est de redimensionner le graphique en fonction de la présence de données dans le tableau.
en reprenant votre exemple, je veux que la macro changer la plage à être considéré par le diagramme, par exemple, le rectangle:
2022-05-07 12_40_53-ModifSourceDiagramme.odt - LibreOffice Writer
et une autre fois (autres données)
2022-05-07 12_41_38-ModifSourceDiagramme.odt - LibreOffice Writer

comme on ferait manuellement, une fois en configurant la plage Tableau2.A1:E3, et une autre Tableau2.A1:D4. Comme ceci dans le premier cas:
(excusez le portugais de ma version de LibreOffice, mais vous reconnaîtrez facilement le dialogue!)
2022-05-07 12_48_29-Intervalos de dados

j’ai tenté de modifier les paramêtres d’appel à votre fonction … mais sans documentation je n’arrive pas au résultat escompté ! :frowning:

merci encore de votre attention,
Philippe

PS Excusez ma comprennette déficiente ! :slight_smile:
PS2 … À la réflexion … je me sens complètement inexcusable! j’ai complétement manqué de respect et d’élégance envers votre attention et le temps que vous m’avez dédié. Je suis à l’amende ! (j’ai bien peur d’avoir maintenant du mal à améliorer ce comportement que j’attribue, en grande partie, à une certaine sénilité)

Bonsoir !

J’ai étudier un peu tout ce qui a trait au problème … j’avance relativement bien … mais j’ai quelques soucis enccore ! :slight_smile:
je vais continuer demain et si je cale je vous fais signe !

pour l’instant, à tout hasard, pouvez-vous me dire pourquoi cette ligne

oDataSequences(nseq) = new SwChartLabeledDataSequence
pose problème (référence d’objet invalide) ? ou, meilleur, comment doit-on écrire ça ?

merci de votre attention,
Philippe

cette ligne pose problème car SwChartLabeledDataSequence n’existe pas dans l’api.

je ne peux donc expliquer comment l’utiliser et tu noteras que cela ne figure pas dans mon exemple

et vous avez, encore, raison! cette classe fait partie du module sw (master) ! mais elle est apparue avec MRI (dans sa version intégrée dans l’éditeur de macros) !

aujourd’hui j’ai un service à la place ! com.sun.star.chart2.LabeledDataSequence (j’aurais dû garder l’image que j’avais hier avec Swtralala, car je ne l’ai pas inventé :slight_smile: !)

je trouve ceci A Combined Chart Using OpenOffice.org Chart2 API « Othman comme information, mais c’est en java ! … je vais regarder plus tard comment dois-je le faire avec oBasic !

merci encore de votre attention,
Philippe

il semble que ceci fonctionne :
dim x as object : x = createUnoService(“com.sun.star.comp.chart2.LabeledDataSequence”)

je suis, pour ça, sur la bonne piste il me semble !

et j’ai, semble-t-il, trouvé la solution en adaptant simplement ce que vous aviez fait.

je pofine, un peu plus tard, et enverrai la solution !

merci encore
Philippe

Pourquoi passer ton temps à utiiser d’autres instructions que celles déjà données :face_with_diagonal_mouth: ?

En l’occurrence

newseqLabel = CreateUnoService("com.sun.star.chart2.data.LabeledDataSequence")

qui est l’appel correct…

L’objet que tu créées supporte le même service com.sun.star.chart2.data.LabeledDataSequence avec les mêmes interfaces, propriétés et méthodes.

parce que … ce n’est pas la même chose il me semble.

ce qui se passe :
si le graphique a, disons, 4 séquences configurées (= 4 “colonnes”) la table oDiag.dataSequences va avoir 4 élements.
si je veux maintenant montrer 5 séquences. je vais devoir créer un nouvel élément dans la table et c’est fait avec

redim preserve oDataSequences(4)
oDataSequences(4) = CreateUnoService( “com.sun.star.comp.chart2.LabeledDataSequence”)

ensuite pour le remplissage (label et données) on utilise en effet >com.sun.star.chart2.data.LabeledDataSequence

n’est-ce pas ainsi ? (mais il y a peut-être des synonymes!)

en tous cas cela a l’air de fonctionner ! :slight_smile:

Si

Oui

par exemple (je ne mets que le début) :

	oDiag = oSel.embeddedObject.component
	oDataProvider = oDiag.getDataProvider()
	oDatasequences = oDiag.DataSequences

redim preserve oDatasequences(4)

	oSeq = oDatasequences(0)
	oValues = oSeq.Values
	newrepr = sValeurs
	newvalues = oDataProvider.createDataSequenceByRangeRepresentation("Tableau2.A2:A5")
	newvalues.Role = oValues.Role
	newseqValues = CreateUnoService("com.sun.star.chart2.data.LabeledDataSequence")
	newseqValues.Values = newvalues

	oLabel = oSeq.Label
	newrepr = sLabel
	newLabel = oDataProvider.createDataSequenceByRangeRepresentation("Tableau2.A1:A1")
	newLabel.Role = oLabel.Role
	newseqLabel = CreateUnoService("com.sun.star.chart2.data.LabeledDataSequence")
	newseqLabel.Label = newLabel

	with oDiag.DataSequences(0)
		.setLabel(newseqLabel.label)
		.setValues(newseqValues.values)
	end with

	oSeq = oDatasequences(1)
	oValues = oSeq.Values
	newrepr = sValeurs
	newvalues = oDataProvider.createDataSequenceByRangeRepresentation("Tableau2.B2:B5")
	newvalues.Role = oValues.Role
	newseqValues = CreateUnoService("com.sun.star.chart2.data.LabeledDataSequence")
	newseqValues.Values = newvalues

	oLabel = oSeq.Label
	newrepr = sLabel
	newLabel = oDataProvider.createDataSequenceByRangeRepresentation("Tableau2.B1:B1")
	newLabel.Role = oLabel.Role
	newseqLabel = CreateUnoService("com.sun.star.chart2.data.LabeledDataSequence")
	newseqLabel.Label = newLabel

	with oDiag.DataSequences(1)
		.setLabel(newseqLabel.label)
		.setValues(newseqValues.values)
	end with

je pense que nous allons mieux nous y retrouver (mais nous progressons!) avec le tableur en annexe !

j’ai mis 4 boutons … les 2 premiers fonctionnent bien ! … mais pas les 2 autres … naturellement !

le problème est avec oDataSequences … quand on le redimensionne, puis on met à jour les diagrammes … cela ne fonctionne pas ! si vous interroger le diagramme il continue avec 7 séquences !

plage.odt (25.2 KB)

j’ai l’impression qu’une fois cela résolu … ça sera tout bon ! :slight_smile: (mais je suis très mauvais pour les prévisions! j’ai souvent de mauvaises surprise ! :slight_smile: )

pour gagner du temps :

sub oDataSequenceTest
dim o, oExt, document, oDiag, oDataSequences
’ récupère le diagramme (unique dans le document)
document = ThisComponent.CurrentController.Frame
o = document.controller.model.embeddedObjects.getByIndex(0)
oExt = o.ExtendedControlOverEmbeddedObject
oDiag = oExt.component
oDatasequences = oDiag.DataSequences
msgBox "uBound(oDatasequences) = " & cstr(uBound(oDatasequences))
end sub