IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Comment insérer une image dans un document word (.docx)


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Homme Profil pro
    Ingénieur Radio Access Network
    Inscrit en
    Décembre 2022
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur Radio Access Network
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2022
    Messages : 10
    Par défaut Comment insérer une image dans un document word (.docx)
    Bonjour à toutes et à tous,

    Je souhaite créer un document Word, en .docx, puis y insérer des images.
    Ces images sont extraites d'un fichier Excel (.xlsx).

    J'arrive à créer le .docx, j'arrive à extraire les images, mais c'est l'insertion dans le document .docx qui me pose problème.

    Voici comment j'extrais les images depuis le fichier .xlsx:
    from openpyxl import load_workbook
    from openpyxl_image_loader import SheetImageLoader

    wb = load_workbook('C:/Users/chemin/fichier.xlsx')
    sheetcpuload = wb['CP UP CPU Load'] => Je vais lire l'onglet "CP UP CPU Load" du fichier "fichier.xlsx" (que j'ai chargé dans la variable "wb")
    image_loader_cpu = SheetImageLoader(sheetcpuload) => je vais charger les images contenues dans cet onglet
    cpuload1 = image_loader_cpu.get('A507') => je définis la variable "cpuloaad1" qui reprend l'image située en case A507 de l'onglet "CP UP CPU Load"
    cpuload1.show() => j'affiche l'image


    Voici comment je crée le document Word (.docx) et comment j'essaie d'y insérer cette image:
    RNC301 = docx.Document() => Création de "RNC301" en .docx
    sections = RNC301.sections
    for section in sections:
    section.top_margin = Cm(1.2)
    section.bottom_margin = Cm(1.2) => mise en page
    section.left_margin = Cm(1.2)
    section.right_margin = Cm(1.2)

    RNC301.add_heading('RNC301 Capacity Report',0) => Ajout d'un en-tête "RNC301 Capacity Report" en format "paragraphe 1"
    para14 = RNC301.add_paragraph('CP-UP CPU Load', style='List Bullet') => Ajout d'une ligne "CP-UP CPU Load"
    RNC301.add_picture(cpuload1,width=Inches(7.8), height=Inches(2.6)) => tentative d'insertion de l'image, en définissant sa hauteur et sa largeur
    RNC301.save ("C:/Users/chemin/nom_du_fichier.docx") => enregistrement de la variable "RNC301" à l'emplacement 'chemin' avec le nom 'nom_du_fichier.docx'

    Voici le message d'erreur que j'obtiens:
    RNC301.add_picture(cpuload1,width=Inches(7.8), height=Inches(2.6))
    AttributeError: read

    J'avoue que je bloque, étant débutant.
    Quand je cherche sur le net, je trouve comment insérer une image dans un document Excel, mais ça ne me convient pas.
    Est-ce que l'un, ou l'une , d'entre vous saurait comment résoudre ce problème svp ?


  2. #2
    Membre Expert
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    1 603
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 1 603
    Par défaut
    Bonjour.

    Votre code est illisible, présenté tel quel.

    En mode édition, veuillez utiliser le bouton # pour encapsuler votre code correctement. On comprend rien.

    Pour insérer des images dans un fichier docX, il y a le module python-docx qui se charge de créer le docX.

    Je m'en suis déjà servi et ça fonctionne bien.

  3. #3
    Membre Expert
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    1 545
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 1 545
    Par défaut
    ton image cpuload1 est une image pillow
    la fonction add_picture attend soit un fichier soit un flux
    Il faudrait donc enregistrer l'image dans un fichier et utiliser ce fichier ensuite.

    (je crois qu'il utilise déjà le module python-docx, même si n'a pas mis l'import dans son extrait de code)

  4. #4
    Expert confirmé
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    4 221
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 221
    Par défaut odt
    hello,
    Ne pas oublier qu'avec LibreOffice, OpenOffice on peut faire des macros en python pour manipuler des documents docx, odt, xlsx, ods.
    Ami calmant, J.P

  5. #5
    Membre Expert
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    1 603
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 1 603
    Par défaut
    Citation Envoyé par umfred Voir le message
    (je crois qu'il utilise déjà le module python-docx, même si n'a pas mis l'import dans son extrait de code)
    C'est ce qu'il m'a semblé aussi.

  6. #6
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 741
    Par défaut
    Citation Envoyé par TomaB74 Voir le message
    J'avoue que je bloque, étant débutant.
    Ce n'est pas du niveau de débutant.

    Citation Envoyé par TomaB74 Voir le message
    Quand je cherche sur le net, je trouve comment insérer une image dans un document Excel, mais ça ne me convient pas.
    Quand je cherche sur le NET j'arrive à trouver cela qui répond (ou pas) à votre besoin mais qui s'applique aux docx et non aux xls

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  7. #7
    Membre habitué
    Homme Profil pro
    Ingénieur Radio Access Network
    Inscrit en
    Décembre 2022
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur Radio Access Network
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2022
    Messages : 10
    Par défaut
    Bonjour,
    Merci pour vos retours et désolé d'avoir mis des extraits de code inexploitables... (je le saurais pour la prochaine fois :-) . je ne sais pas si ce qui suit sera plus lisible... :-(
    Oui, j'utilise python-docx pour créer le document Word
    Effectivement, il faut enregistrer les images dans un répertoire, puis spécifier ce chemin d'accès lors du "add.picture"

    Voici ce que ça donne:
    #import docx
    #from docx.shared import Inches, Cm
    #import os
    #from openpyxl import load_workbook
    #from openpyxl_image_loader import SheetImageLoader
    #
    #wb = load_workbook('C:/Users/chemin/fichier.xlsx')
    #sheetcpuload = wb['CP UP CPU Load']
    #image_loader_cpu = SheetImageLoader(sheetcpuload)
    #cpuload1 = image_loader_cpu.get('A507')
    #
    #cpuload1.save(r'C:/Users/chemin/cpuload1.png') => Pour sauvegarder l'image dans un répertoire

    #RNC301 = docx.Document()
    #sections = RNC301.sections
    #for section in sections:
    # section.top_margin = Cm(1.2)
    # section.bottom_margin = Cm(1.2)
    # section.left_margin = Cm(1.2)
    # section.right_margin = Cm(1.2)
    #
    #RNC301.add_heading('RNC301 Capacity Report',0)
    #para14 = RNC301.add_paragraph('CP-UP CPU Load', style='List Bullet')
    #RNC301.add_picture('C:/chemin/cpuload1.png', width=Inches(7.8), height=Inches(2.6)) => Pour insérer l'image dans le document Word
    #RNC301.save ("C:/Users/chemin/fichier.docx")
    #

    Encore merci pour votre aide

    Joyeuses fêtes

  8. #8
    Membre Expert
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    1 603
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 1 603
    Par défaut
    Quand je disais d'employer le #, c'était pour tout le code en un seul bloc, pas comme si vous commentiez le code

    Editez votre message et regardez dans les options d'édition proposées, tout à droite, le #.

    Vous cliquez une fois dessus, ça vous crée des balises CODES entre []. Collez votre code dedans.

    Ca respectera l'indentation de ce dernier.

  9. #9
    Expert confirmé
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    4 221
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 221
    Par défaut
    Hello,
    A titre indicatif (pour le fun) , voici une macro python embarquée LibreOffice qui prend les images et les noms d'images et les met dans un tableau dans un nouveau fichier docx :
    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
     coding: utf-8
    from __future__ import unicode_literals
    import uno
    from com.sun.star.beans import PropertyValue
     
     
    def dict_to_property(values, uno_any=False):
        ps = tuple([PropertyValue(Name=n, Value=v) for n, v in values.items()])
        if uno_any:
            ps = uno.Any('[]com.sun.star.beans.PropertyValue', ps)
        return ps
     
     
    def copieImagesXl2Word():
        doc = XSCRIPTCONTEXT.getDocument()
        draw_page = doc.getCurrentController().getActiveSheet().getDrawPage()
        for image in draw_page:
            print(image.Name)
        print(draw_page.Count)
        ctx = uno.getComponentContext()
        smgr = ctx.ServiceManager
        desktop = smgr.createInstanceWithContext( "com.sun.star.frame.Desktop",ctx)
        # open a writer document
        newDoc = desktop.loadComponentFromURL("private:factory/swriter", "_blank", 0,())
        oText = newDoc.getText()  
        oCurseur = oText.createTextCursor()  
        #--- création tableau ---   
        oTable = newDoc.createInstance( "com.sun.star.text.TextTable" )  
        #Définit les dimensions du tableau:
        oTable.initialize( 4, 2 ) 
        oText.insertTextContent(oCurseur, oTable, False )
        oTable.getCellByPosition(0,0).setString("Image")
        oTable.getCellByPosition(1,0).setString("Nom Image")
        x=1
        for image in draw_page:
            print(image.Name)
            oGraph = newDoc.createInstance("com.sun.star.text.GraphicObject")
            cellule1 = oTable.getCellByPosition(1,x)
            cellule1.setString(image.Name)
            cellule2 = oTable.getCellByPosition(0,x)
            texte = cellule2.getText()
            oGraph.Graphic = image.Graphic
            curseur = texte.createTextCursor()  
            texte.insertTextContent( curseur ,oGraph , False )  
            x +=1
        path_docx = uno.systemPathToFileUrl('D:/temp/MonFichierDocx.docx')
        args = {
            'FilterName': 'MS Word 2007 XML',
        }
        args = dict_to_property(args)
        newDoc.storeToURL(path_docx, args)
    Fichier source :
    Nom : FicTableur.png
Affichages : 735
Taille : 175,1 Ko

    Fichier résultat :
    Nom : FicTT.png
Affichages : 716
Taille : 35,3 Ko

    Ami calmant, J.P

Discussions similaires

  1. insérer une image dans un document word
    Par jihad dans le forum VB.NET
    Réponses: 4
    Dernier message: 25/01/2011, 10h06
  2. Réponses: 10
    Dernier message: 08/02/2006, 19h42
  3. Comment insérer une image dans un graphique?
    Par Leclair2000 dans le forum Composants VCL
    Réponses: 3
    Dernier message: 23/05/2005, 09h29
  4. Comment insérer une image dans une cellule d'un TDrawGrid ?
    Par kanux dans le forum Composants VCL
    Réponses: 4
    Dernier message: 15/01/2005, 18h58
  5. [Crystal Reports 9] comment insérer une image dans Détails
    Par VVE dans le forum SAP Crystal Reports
    Réponses: 2
    Dernier message: 22/10/2003, 17h06

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo