[Résolu][Calc] changer l'image de fond d'une paroi dans un graphique XY

Discussions et questions sur tout ce qui concerne la programmation tous langages et tous modules confondus.

Modérateur : Vilains modOOs

Règles du forum
:alerte: Balisage obligatoire dans cette section !
Aidez-nous à vous aider au mieux en balisant correctement votre question : reportez-vous sur les règles de cette section avant de poster !
FredBauchot
NOOuvel adepte
NOOuvel adepte
Messages : 12
Inscription : 24 déc. 2024 11:07

[Résolu][Calc] changer l'image de fond d'une paroi dans un graphique XY

Message par FredBauchot »

Bonjour,
et bonne année 2026 aux lecteurs de ce texte.
Je suis sous Libre Office Calc (version 25,2,7,2) en environnement windows 11, et suis confronté à un problème pour modifier par une macro dans un graphique de type XY l’image de fond de la paroi (ce que je comprends correspondre à « diagram » en anglais). Ce que j’essaye de faire par macro est l’équivalent de ce qui est réalisable manuellement en sélectionnant le graphique, puis la paroi, puis clic droit, puis « formater la paroi », puis onglet « Zone », puis « Image », puis « Ajouter / Importer », puis sélection d’un fichier jpg, puis « style » = Etiré, puis « OK ».
J’ai fait plusieurs tentatives de macro, toujours avec comme point de blocage la propriété FillBitmap ou FillBitmapURL pour un objet diagram. Le code de ma macro est fournie, où ma dernière tentative est de passer par un GraphicProvider, et où on voit sur des instructions mises en commentaires des tentatives précédentes où j’ai aussi essayé la propriété FillBitmapURL.
Si quelqu’un sait me donner une piste , elle sera la bienvenue. Merci

Code : Tout sélectionner

Sub ImportCarteJPG
REM =======================================================================================
REM Macro récupérant le nom d'un fichier de carte JPG, puis affectant cette image comme
REM fond de la paroi du graphique de trace.
REM =======================================================================================
REM ---------------------------------------------------------------------------------------
REM Déclaration des variables
REM ---------------------------------------------------------------------------------------
	Dim Dossier As object
	Dim Valeur As Integer 
	Dim urlCible As String
	dim Altitude as object
	dim NomFichierImageCarte as object
	dim oCalc as object
	Dim oProvider as object
	Dim oGraphic as object
    Dim GraphiqueCarte as object
    Dim DiagramCarte as object

REM ---------------------------------------------------------------------------------------
REM Initialisation des variables
REM --------------------------------------------------------------------------------------- 
   	oCalc = ThisComponent
    Altitude = ThisComponent.Sheets.getByName("Altitude")
    NomFichierImageCarte = Altitude.getcellrangebyname("NomFichierImageCarte")	

REM ---------------------------------------------------------------------------------------
REM gel de l'affichage pour gagner en performance
REM ---------------------------------------------------------------------------------------    
	oCalc.lockControllers  

REM ---------------------------------------------------------------------------------------
REM création du service sélection d'un fichier
REM ---------------------------------------------------------------------------------------
	Dossier = CreateUnoService("com.sun.star.ui.dialogs.FilePicker") 
	Valeur = Dossier.Execute()
	If Valeur = 1 Then urlCible=ConvertFromUrl(Dossier.Files(0))

REM ---------------------------------------------------------------------------------------
REM on vérifie qu'on a bien un fichier jpg
REM ---------------------------------------------------------------------------------------
	If right(urlCible,4) <>".jpg" and right(urlCible,4) <> ".JPG" then
    	msgbox "Merci de spécifier un fichier .jpg ou .JPG"
    	exit sub
    else	
	REM si il y a un fichier jpg on le mémorise
		NomFichierImageCarte.string = urlCible
	end if
	
REM ---------------------------------------------------------------------------------------
REM on spécifie l'image comme fond de la paroi du graphique de trace
REM ---------------------------------------------------------------------------------------	
	GraphiqueCarte = ThisComponent.CurrentController.ActiveSheet.DrawPage.getByIndex(0)
	DiagramCarte = GraphiqueCarte.EmbeddedObject.component.Diagram
	
	oProvider = createUnoService("com.sun.star.graphic.GraphicProvider")

    Dim aProps(0) As New com.sun.star.beans.PropertyValue
    aProps(0).Name = "URL"
    aProps(0).Value = ConvertToURL(urlCible)
	oGraphic = oProvider.queryGraphic(aProps())
	
	DiagramCarte.setPropertyValue("FillStyle", com.sun.star.drawing.FillStyle.BITMAP)
    DiagramCarte.setPropertyValue("FillBitmap", oGraphic)
rem	DiagramCarte.FillStyle = com.sun.star.drawing.FillStyle.BITMAP
rem	DiagramCarte.FillBitmap = oGraphic
rem	DiagramCarte.FillBitmapURL = ConvertToURL(urlCible)
rem	DiagramCarte.FillBitmapMode = com.sun.star.drawing.BitmapMode.STRETCH

REM ---------------------------------------------------------------------------------------    
REM dégel de l'affichage
REM ---------------------------------------------------------------------------------------
	ThisComponent.unlockControllers	
end sub
Dernière modification par Oukcha le 10 janv. 2026 12:34, modifié 1 fois.
LibreOffice version 24.8.4.2 (x86_64), sur Windows 11 Famille, version 23H2
Avatar de l’utilisateur
Dolev
SuppOOrter
SuppOOrter
Messages : 1189
Inscription : 19 août 2018 05:20

Re: [calc] changer l'image de fond d'une paroi dans un graphique XY

Message par Dolev »

Bonjour,

Avez-vous fait une recherche ?
viewtopic.php?t=6263&hilit=paroi

Comme le précise Pierre-Yves Samyn, Xray est l'outil indispensable pour explorer les propriétés du graphique.

Si cela ne résout pas le problème, fournissez un document sur lequel travailler.
Open Office 4.1.16 sous Windows 11
FredBauchot
NOOuvel adepte
NOOuvel adepte
Messages : 12
Inscription : 24 déc. 2024 11:07

Re: [Calc] changer l'image de fond d'une paroi dans un graphique XY

Message par FredBauchot »

Re-bonjour,
merci pour la rapidité de la réponse.
Oui, j'avais fait des recherches, mais n'étais pas tombé sur quelque chose pointant vers Xray. Je vais donc commencer à investiguer cet outil. En parallèle je joins un fichier où mon problème se pose, dans l'espoir que cela permette de progresser.
Cordialement, Frédéric
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
LibreOffice version 24.8.4.2 (x86_64), sur Windows 11 Famille, version 23H2
Avatar de l’utilisateur
Dolev
SuppOOrter
SuppOOrter
Messages : 1189
Inscription : 19 août 2018 05:20

Re: [Calc] changer l'image de fond d'une paroi dans un graphique XY

Message par Dolev »

Re,
FredBauchot a écrit : 10 janv. 2026 11:20toujours avec comme point de blocage la propriété FillBitmap ou FillBitmapURL pour un objet diagram.
Vérifiez avec Xray mais de mon côté, je n'ai pas de propriété FillBitmapURL.
Donc on ne peut pas mettre directement une URL pour la paroi.
Où avez-vous trouvé cette information car l'interface ne permet pas de sélectionner d'image autre que celle du dialogue :
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
Open Office 4.1.16 sous Windows 11
FredBauchot
NOOuvel adepte
NOOuvel adepte
Messages : 12
Inscription : 24 déc. 2024 11:07

Re: [Calc] [Résolu] changer l'image de fond d'une paroi dans un graphique XY

Message par FredBauchot »

Bonjour,
j'ai réglé mon problème sans réellement le résoudre, mais en l'évitant par une approche différente donnant le résultat voulu. Au lieu de spécifier une image comme fond de la paroi du graphique, il suffit d'avoir un graphique dont le fond de paroi est vide et ensuite de créer en arrière plan une "ImageShape" dont il est facile d'associer une image contenue dans un fichier jpg. La position et taille de l'ImageShape sont exactement calquées sur celles du graphique.
Le code est le suivant:

Code : Tout sélectionner

Sub ImportCarteJPG
REM =======================================================================================
REM Macro récupérant le nom d'un fichier de carte JPG, puis affectant cette image comme
REM fond de la paroi du graphique de trace.
REM =======================================================================================
REM ---------------------------------------------------------------------------------------
REM Déclaration des variables
REM ---------------------------------------------------------------------------------------
	Dim Dossier As object
	Dim Valeur As Integer 
	Dim urlCible As String
	dim Altitude as object
	dim NomFichierImageCarte as object
	dim oCalc as object
	Dim oDrawPage as object
	Dim oGraphic as object
    Dim GraphiqueCarte as object
    dim sImageURL as string
    dim oImageShape as object
    dim bTrouvee as Boolean
    dim i as long
    dim oShape as object


REM ---------------------------------------------------------------------------------------
REM Initialisation des variables
REM --------------------------------------------------------------------------------------- 
   	oCalc = ThisComponent
    Altitude = ThisComponent.Sheets.getByName("Altitude")
    NomFichierImageCarte = Altitude.getcellrangebyname("NomFichierImageCarte")	

REM ---------------------------------------------------------------------------------------
REM gel de l'affichage pour gagner en performance
REM ---------------------------------------------------------------------------------------    
	oCalc.lockControllers  

REM ---------------------------------------------------------------------------------------
REM création du service sélection d'un fichier
REM ---------------------------------------------------------------------------------------
	Dossier = CreateUnoService("com.sun.star.ui.dialogs.FilePicker") 
	Valeur = Dossier.Execute()
	If Valeur = 1 Then urlCible=ConvertFromUrl(Dossier.Files(0))

REM ---------------------------------------------------------------------------------------
REM on vérifie qu'on a bien un fichier jpg
REM ---------------------------------------------------------------------------------------
	If right(urlCible,4) <>".jpg" and right(urlCible,4) <> ".JPG" then
    	msgbox "Merci de spécifier un fichier .jpg ou .JPG"
    	exit sub
    else	
	REM si il y a un fichier jpg on le mémorise
		NomFichierImageCarte.string = urlCible
	end if
	
REM ---------------------------------------------------------------------------------------
REM on spécifie l'image comme fond derrière le graphique de trace
REM ---------------------------------------------------------------------------------------	
	GraphiqueCarte = ThisComponent.CurrentController.ActiveSheet.DrawPage.getByIndex(0)	
	sImageURL =  ConvertToURL(urlCible)
	oDrawPage = ThisComponent.CurrentController.ActiveSheet.DrawPage	
	bTrouvee = False
	
REM 1. Recherche d'une image existante nommée "FondCarte"
    For i = 0 To oDrawPage.getCount - 1
        oShape = oDrawPage.getByIndex(i)

        If oShape.supportsService("com.sun.star.drawing.GraphicObjectShape") Then
            If oShape.Name = "FondCarte" Then
                oImageShape = oShape
                bTrouvee = True
                Exit For
            End If
        End If
    Next i	
	
REM 2. Si trouvée → on remplace l'image
    If bTrouvee Then
        oImageShape.GraphicURL = sImageURL
    Else
REM 3. Sinon → création de l'image
    oImageShape = oCalc.createInstance("com.sun.star.drawing.GraphicObjectShape")
    oImageShape.Name = "FondCarte"
    oImageShape.Position = GraphiqueCarte.Position	' --- Position = position du graphique
    oImageShape.Size = GraphiqueCarte.Size	' --- Taille = taille du graphique
    oImageShape.GraphicURL = sImageURL    ' --- Affectation de l’image
    oDrawPage.add(oImageShape)    ' --- Insertion dans la page
    GraphiqueCarte.ZOrder = oImageShape.ZOrder + 1   ' --- Mise à l’arrière-plan (image derrière le graphique)
	end if


REM ---------------------------------------------------------------------------------------    
REM dégel de l'affichage
REM ---------------------------------------------------------------------------------------
	ThisComponent.unlockControllers	
end sub
LibreOffice version 24.8.4.2 (x86_64), sur Windows 11 Famille, version 23H2
FredBauchot
NOOuvel adepte
NOOuvel adepte
Messages : 12
Inscription : 24 déc. 2024 11:07

Re: [Calc] [Résolu] changer l'image de fond d'une paroi dans un graphique XY

Message par FredBauchot »

Re-bonjour,
pour répondre à la question de Dolev, mon Libre Office me propose la boîte de dialogue en attachement où l'onglet "Zone" (différent de votre onglet "Remplissage") permet par le bouton "Ajouter / Importer" de spécifier un fichier image.
Frédéric
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
LibreOffice version 24.8.4.2 (x86_64), sur Windows 11 Famille, version 23H2
Avatar de l’utilisateur
Dude
IdOOle de la suite
IdOOle de la suite
Messages : 26177
Inscription : 03 mars 2006 07:45
Localisation : 127.0.0.1

Re: [Résolu][Calc] changer l'image de fond d'une paroi dans un graphique XY

Message par Dude »

Salut,

Ce n'est pas parce que l'IHM propose que l'API dispose.
Souvent les développeurs de LibO rajoutent des fonctions mais ne créent pas leur accessibilité par macro.
Sous AOO, l'import d'image peut se faire sous Draw dans le dialogue du remplissage des formes.

As-tu fait ce que Dolev indique et explorer l'objet graphique avec XRay ?
Mets-nous une copie d'écran des propriétés affichées qu'on voit si FillBitmapURL est documenté.
FredBauchot
NOOuvel adepte
NOOuvel adepte
Messages : 12
Inscription : 24 déc. 2024 11:07

Re: [Résolu][Calc] changer l'image de fond d'une paroi dans un graphique XY

Message par FredBauchot »

Bonjour,
non, je n'ai pas exploré l'objet graphique avec XRay, la solution que j'ai trouvée pour contourner mon problème répondant parfaitement à mon besoin.
Cordialement, Frédéric
LibreOffice version 24.8.4.2 (x86_64), sur Windows 11 Famille, version 23H2
Avatar de l’utilisateur
Dude
IdOOle de la suite
IdOOle de la suite
Messages : 26177
Inscription : 03 mars 2006 07:45
Localisation : 127.0.0.1

Re: [Résolu][Calc] changer l'image de fond d'une paroi dans un graphique XY

Message par Dude »

Pour les prochains souhaitant une solution, on peut utiliser la bibliothèque zBasic qui fait cela en quelques lignes de code :
https://beaussier.com/wiki/index.php?ti ... rsonnalisé
Poser une question, c'est bien. Répondre aux autres, c'est encore mieux.
Améliorez AOO et votez pour les issues