> Modules non standards > Autres modules non standards > openpyxl (lecture et ecriture xlsx)
openpyxl (lecture et ecriture xlsx)
openpyxl permet de lire, écrire et modifier des fichiers .xlsx. Faire import openpyxl pour l'utiliser
Manipulation d'un workbook :
- workbook = openpyxl.Workbook() : création d'un nouveau workbook, qui par défaut a toujours un onglet.
- workbook.save('output.xlsx') : pour sauvegarder le workbook.
- workbook = openpyxl.load_workbook('input.xlsx') : pour lire un workbook (attention, l'extension doit être .xlsx !)
- workbook = openpyxl.load_workbook('input.xlsx', data_only = True) : charge le workbook en donnant les valeurs plutôt que les formules (le défaut est data_only = False).
- workbook.close() : ferme le workbook, surtout important en mode read_only.
Usage des ressources :
- par défaut, openpyxl utilise beaucoup de mémoire, typiquement 50 fois la taille du fichier.
- workbook = openpyxl.load_workbook('input.xlsx', read_only = True) : permet d'ouvrir le workbook en lecture seule, ce qui économise beaucoup les ressources quand gros fichier, mais peut être horriblement long même sur un fichier de quelques milliers de lignes si on veut lire tout le fichier !!!!
- workbook = Workbook(write_only = True) : permet d'écrire des gros fichiers :
- il faut avoir lxml installé (c'est pas le même objet qui est utilisé).
- attention, pas d'onglet crée initialement.
- les rows ne peuvent être rajoutés qu'en faisant des append (pas d'accès direct aux cellules)
Sheets (onglets) d'un workbook :
Cellules :
- sheet['A1'] : renvoie l'objet Cell
- sheet['A1'].value : renvoie la valeur dans la cellule.
- sheet['A1'].value = 7 : positionne la valeur.
- sheet['A1'] = 7 : marche aussi directement.
- sheet.cell(1, 1) : adressage par coordonnées (renvoie l'objet Cell). Origines des lignes et colonnes à 1, et c'est dans l'ordre (ligne, colonne)
- sheet.cell(1, 1).value : renvoie la valeur
- sheet.cell(1, 1).value = 'ma valeur' : positionne la valeur
- la valeur d'une cellule non remplie est None
- pour une cellule cell à la case B4 :
- cell.row : ici 4.
- cell.column : numéro de colonne, ici 2
- cell.coordinate : ici B4.
- cell.column_letter : ici B.
- cell.value : la valeur
- cell.data_type : le type de la valeur : 's' pour une chaîne, 'n' pour une valeur numérique (ou None, c'est à dire vide), d pour une date, f pour une formule.
- cell.comment : un objet Comment (s'il est not None, faire cell.comment.text pour avoir le texte du commentaire
- cell.value = '=2*A1' : on peut affecter directement une formule à une cellule.
- attention, dans les formules :
- il faut utiliser le nom anglais des fonctions.
- il faut séparer les arguments par des virgules (pas des point-virgules).
- pour boucler sur une zone par ligne (attention, ne marche pas avec un workbook en read_only) :
for row in sheet.iter_rows(min_row = 1, max_row = 3, min_col = 1, max_col = 5):
for cell in row:
print(cell.value)
- row est en fait un tuple d'objets de type Cell (openpyxl.cell.cell.Cell).
- on peut faire la même chose par colonne avec sheet.iter_cols (attention, ne marche pas avec un workbook en read_only).
- on peut boucler sur toutes les lignes en faisant simplement :
for row in sheet:
print(row)
for cell in row:
print(cell.value)
- merge (fusion) de cellules :
- sheet.merge_cells('A1:D1') : pour fusionner
- on peut faire aussi sheet.merge_cells(start_row = 1, start_column = 1, end_row = 1, end_column = 4)
- sheet.unmerge_cells('A1:D1') : pour défusionner
- avec un workbook en read_only, on peut encore utiliser sheet.rows et sheet.columns :
for column in sheet.columns:
for cell in column:
print(cell.value)
Application directement d'un style :
- cell.font = openpyxl.styles.Font(name = 'Courier', size = 10, italic = True, bold = True, underline = 'single', color = 'FF0000')
- cell.fill = openpyxl.styles.PatternFill(patternType = 'solid', fgColor = 'CCFFCC')
- borderStyle = openpyxl.styles.Side(style = 'medium', color = '00FF00'); cell.border = openpyxl.styles.Border(left = borderStyle, right = borderStyle, top = borderStyle, bottom = borderStyle) Les styles des bordures peuvent être : 'dashDotDot', 'mediumDashDotDot', 'medium', 'double', 'dotted', 'hair', 'mediumDashDot', 'mediumDashed', 'thick', 'dashed', 'dashDot', 'thin', 'slantDashDot'.
- cell.alignment = openpyxl.styles.Alignment(horizontal = 'center')
Styles nommés : c'est une meilleure façon, on définit des styles, et on les utilise :
- on définit un style :
myStyle = openpyxl.styles.NamedStyle(name = 'my_style')
myStyle.font = openpyxl.styles.Font(name = 'Courier', size = 12, color = 'FF0000')
myStyle.fill = openpyxl.styles.PatternFill(patternType = 'solid', fgColor = 'FFFF55')
borderStyle = openpyxl.styles.Side(style = 'dashDot', color = 'FF00FF')
myStyle.border = openpyxl.styles.Border(left = borderStyle, right = borderStyle, top = borderStyle, bottom = borderStyle)
- puis, on peut le rajouter au workbook(en fait, automatique à la première utilisation)
- puis, on l'affecte à des cellules : cell.style = myStyle ou même en utilisant son nom : cell.style = 'my_style'
Pour adapter la largeur des colonnes :
for j, col in enumerate(sheet.columns, 1):
sheet.column_dimensions[openpyxl.utils.get_column_letter(j)].auto_size = True
Pour avoir une cellule avec plusieurs lignes :
sheet.cell(i, j) = 'ligne1
ligne2'
sheet.cell(i, j).alignment = openpyxl.styles.Alignment(wrapText = True)
On peut créer des graphiques !
Copyright python-simple.com
programmer en python, tutoriel python, graphes en python, Aymeric Duclert