Bonjour,

Je suis habituellement assez autonome pour résoudre les problèmes rencontrés au cours du développement de mes outils. Mais là je sèche un peu.

J'ai fait une mise à jour (je réalise que c'est une erreur) de openpyxl et depuis je n'arrive plus à insérer une image dans un fichier excel. Je rencontre l'erreur suivante :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
IOError: cannot identify image file 'path image'
Mon programme lit un premier fichier Excel (TableauSynthese.xlsx), chaque ligne correspond à un objet avec diverses informations le concernant. Pour chaque objet je souhaite créer une fiche résultat dans laquelle j'intègre ces diverses informations ainsi qu'une photo de cet objet et le logo de mon entreprise. Cette fiche résultat est créé à partir d'un fichier excel de référence (Excel_ref.xlsx), dans un onglet j'y ai créé l'aspect visuel de la fiche et un deuxième onglet sert à l'écriture des données récupérées par le script python.

Passer par un Excel de référence me fait gagner du temps, car cela m'évite de coder entièrement l'aspect de la fiche résultat par contre, l'écriture dans ce fichier explose la mise en page. A priori, openpyxl a du mal à conserver la mise en page lors de l'écriture. Si vous avez des solutions concernant ce problème je suis preneur. Si non, je vais coder la mise en page de la fiche résultat.

Et le problème pour lequel je sollicite votre aide concerne l'insertion d'image dans la fiche résultat. Ca fonctionnait très bien avant mais depuis la MàJ d'openpyxl ça ne fonctionne plus.

Ci-dessous, voici mon script pour générer les fiches résultats :

Il faut juste remplacer les XXXX dans les chemins d'accès par les chemins d'accès que vous utiliserez.

TableauSynthese.xlsx
Excel_Ref.xlsx

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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
#!/usr/bin/python
# -*- coding: utf-8 -*-
 
import os.path
import shutil
import os
from openpyxl import Workbook
from openpyxl.styles import PatternFill, Border, Side, Alignment, Protection, Font
from openpyxl.drawing.image import Image
from openpyxl.worksheet.pagebreak import Break
from openpyxl.worksheet.properties import WorksheetProperties, PageSetupProperties
from openpyxl.utils import get_column_letter, column_index_from_string
from openpyxl import load_workbook
from PIL import Image as PILImage
 
path_xls_ref = "XXXX\Excel_Ref.xlsx"
xls_synthese = "XXXX\TableauSynthese.xlsx"
rep_resultat = r"XXXX\Fiche"
logo = "XXXX\Logo.png"
 
def lecture_tableau_synthese (a) :
    dico_synthese ={}
    wb = load_workbook(a,data_only=True)
 
    feuille_xls = wb['Synthese']
 
    # +1 car python commence une liste à 0
    nbr_colonne =  range(len(list(feuille_xls.columns))+1)
    nbr_ligne =  range(len(list(feuille_xls.rows))+1)
 
    #pour virer le 0 de la liste tout en gardant la dimension du tableau avec le +1 précédent
    nbr_colonne = nbr_colonne[1:]
 
    #on commence à 3 car il y a la ligne 0 qui n'existe pas, puis une ligne vide puis 2 ligne de titre
    nbr_ligne = nbr_ligne[4:]
 
 
    for ligne in nbr_ligne :
        temp = {}
 
        num_caisse = str(feuille_xls['A'+str(ligne)].value).strip()
        num_echant = str(feuille_xls['B'+str(ligne)].value)
        nom_echant = feuille_xls['C'+str(ligne)].value
        provenance = feuille_xls['D'+str(ligne)].value
        ded_contact = feuille_xls['E'+str(ligne)].value
        ded_10_cm = feuille_xls['F'+str(ligne)].value
        date_spectro = feuille_xls['G'+str(ligne)].value
        masse =feuille_xls['I'+str(ligne)].value
        conta_alpha_bq = feuille_xls['L'+str(ligne)].value
        conta_beta_bq = feuille_xls['M'+str(ligne)].value
        surf_frottee = feuille_xls['N'+str(ligne)].value
        commentaire = feuille_xls['O'+str(ligne)].value
 
        temp['num_caisse'] = num_caisse
        temp['nom_echant'] = nom_echant
        temp['provenance'] = provenance
        temp['ded_contact'] = ded_contact
        temp['ded_10_cm'] = ded_10_cm
        temp['date_spectro'] = date_spectro
        temp['masse'] = masse
        temp['conta_alpha_bq'] = conta_alpha_bq
        temp['conta_beta_bq'] = conta_beta_bq
        temp['surf_frottee'] = surf_frottee
        temp['commentaire'] = commentaire
 
        dico_synthese[ num_echant] = temp
 
    return dico_synthese
 
def remplissage_fiche (a,b,c) :
    #ouverture du fichier et on se place dans le bon onglet
    wb = load_workbook(a, keep_links=True)
    ws = wb["Extraction"]
 
    ws["B1"]=c
    ws["B2"]=b['num_caisse']
    ws["B3"]=b['nom_echant']
    ws["B4"]=b['provenance'] 
    ws["B5"]=b['ded_contact'] 
    ws["B6"]=b['ded_10_cm'] 
    ws["B7"]=b['date_spectro']
    ws["B8"]=b['masse']
    ws["B9"]=b['conta_alpha_bq']
    ws["B10"]=b['conta_beta_bq']
    ws["B11"]=b['surf_frottee']
    ws["B12"]=b['commentaire'] 
 
    #on retoure sur la fiche mesure pour mettre le logo
    feuille_xls = wb['Feuil1']
    img = Image(logo,size=(50, None),nochangeaspect=True, nochangearrowheads=True)
    img.drawing.left = 85
    img.drawing.top = 21
    feuille_xls.add_image(img) 
 
    wb.save(a)
 
donnees_synthese = lecture_tableau_synthese(xls_synthese)
 
excel_ref = path_xls_ref.split("\\")
for value in excel_ref:
    if not value :
        excel_ref.remove(value)
 
nom_excel_ref = excel_ref[-1]
 
 
 
for key in donnees_synthese.keys() :
    # on créée le chemin vers le répertoire de la caisse
    path_rep =  rep_resultat + "\\Caisse n " + str(donnees_synthese[key]['num_caisse'])
 
    # on test s'il existe ou non
    if os.path.isdir(path_rep) == FALSE :
        os.mkdir(path_rep)
 
    # on créée le chemin vers la fiche
    path_fiche = rep_resultat + "\\Caisse n " + str(donnees_synthese[key]['num_caisse']) + "\\" + str(key) +".xlsx"
 
    #on test si la fiche existe déjà ou non
    if os.path.isfile(path_fiche) == FALSE :
        # on copie l'excel de référence dans le nouveau répertoire
        shutil.copy(path_xls_ref,path_rep)
 
        # on renomme l'excel de référence
        nom_xls = str(path_rep) + "\\" +str(key)+".xlsx"
        path_temp_excel = str(path_rep) + "\\" + str(nom_excel_ref)
 
        #on renomme les fichiers excel
        os.rename(path_temp_excel,nom_xls)
 
 
        #on remplie les fichiers excel
        remplissage_fiche(nom_xls,donnees_synthese[key],key)
D'avance merci, je poursuit tout de même mes recherches.