Accéder au contenu principal

openpyxl : Automatiser des tâches Excel avec Python

Apprenez à lire, écrire et styliser des fichiers Excel à l'aide d'openpyxl. Découvrez des exemples pratiques pour travailler avec les formats Excel modernes (.xlsx) et les fonctionnalités avancées.
Actualisé 29 mai 2025  · 8 min de lecture

openpyxl est une bibliothèque Python efficace qui vous permet de lire et d'écrire des fichiers Excel dans les formats modernes basés sur XML (.xlsx, .xlsm) introduits dans Excel 2007, avec une prise en charge complète des fonctionnalités avancées à partir d'Excel 2010. Il a été développé à l'origine comme un portage Python de PHPExcel et continue d'être maintenu par une communauté active de développeurs. La bibliothèque excelle dans l'automatisation des données, les rapports et les flux de travail de formatage, ce qui la rend particulièrement utile pour les utilisateurs qui ont besoin de travailler avec des fichiers Excel mais qui n'ont pas installé Excel sur leur système.

De nombreuses organisations utilisent openpyxl pour automatiser des rapports financiers, générer des graphiques à partir d'exportations de bases de données et appliquer des formules et des mises en forme à des rapports de marketing. Cette bibliothèque offre un contrôle fin sur les fichiers Excel entièrement par le biais du code Python.

Qu'est-ce que openpyxl ?

openpyxl est conçu spécifiquement pour fournir un support natif pour les formats Excel 2010+. La bibliothèque fonctionne avec plusieurs formats de fichiers :

  •  .xlsx - Classeur Excel

  •  .xlsm - Classeur Excel avec macros

  •  .xltx - Modèle Excel

  •  .xltm - Modèle Excel avec macros

L'un des principaux avantages d'openpyxl est qu'il ne nécessite pas l'installation d'Excel sur votre ordinateur. Il est donc idéal pour les environnements de serveurs, les systèmes de rapports automatisés et les pipelines de traitement de données. Plusieurs autres bibliothèques Python, dont pandas, utilisent openpyxl comme interface Excel, ce qui démontre sa fiabilité et sa fonctionnalité.

Installation et importation de openpyxl

L'installation d'openpyxl est simple en utilisant pip :

pip install openpyxl

Pour renforcer la sécurité lorsque vous travaillez avec des fichiers provenant de sources non fiables, vous pouvez également installer le paquetage optionnel defusedxml:

pip install defusedxml

Pour utiliser openpyxl dans vos scripts Python, importez les classes nécessaires :

from openpyxl import Workbook, load_workbook

Concepts clés et terminologie

Pour utiliser efficacement openpyxl, vous devez comprendre la structure de base d'Excel :

  • Cahier d'exercices: Le fichier Excel lui-même, contenant une ou plusieurs feuilles de calcul.
  • Feuille de travail: Onglets/feuilles individuels dans un classeur
  • Cellule: Points de données individuels dans une feuille de calcul, identifiés par la lettre de la colonne et le numéro de la ligne (par exemple, "A1").
  • Rangée: Ligne horizontale de cellules, identifiées par des numéros (1, 2, 3...)
  • Colonne: Ligne verticale de cellules, identifiées par des lettres (A, B, C...)

Dans openpyxl, vous pouvez référencer des cellules en utilisant l'une ou l'autre des méthodes suivantes :

  • Références de style Excel: sheet[“A1”]

  • Indexation ligne-colonne: sheet.cell(row=1, column=1) (Note : openpyxl utilise une indexation basée sur 1 et non sur 0)

Lire des fichiers Excel avec openpyxl

Voici un exemple pratique montrant comment lire des données à partir d'un fichier Excel :

Charger et explorer un classeur

from openpyxl import load_workbook

# Load the workbook - use read_only=True for large files
wb = load_workbook('sample.xlsx', read_only=False, data_only=False)
# data_only=True reads values instead of formulas

Les paramètres facultatifs déterminent la manière dont le classeur est chargé :

  • read_only=True améliore les performances pour les fichiers volumineux mais limite les capacités d'édition

  • data_only=True renvoie des valeurs calculées au lieu de formules

Interroger les données

Pour traiter efficacement plusieurs cellules, utilisez les méthodes d'itération :

# Iterate through rows
for row in sheet.iter_rows(min_row=1, max_row=5, values_only=True):
    print(row)  # Returns a tuple of values

# Iterate through columns
for column in sheet.iter_cols(min_col=1, max_col=3, values_only=True):
    print(column)  # Returns a tuple of values

# Access a range of cells
cell_range = sheet["A1:C5"]
for row in cell_range:
    for cell in row:
        print(cell.value)

Convertir en structures de données Python

Vous pouvez facilement transformer des données Excel en structures de données Python :

# Convert worksheet data to a list of dictionaries
def sheet_to_dict(sheet):
    data = []
    headers = [cell.value for cell in sheet[1]]  # First row as headers
    
    for row in sheet.iter_rows(min_row=2, values_only=True):
        row_data = {}
        for key, value in zip(headers, row):
            row_data[key] = value
        data.append(row_data)
    
    return data

# Example usage
data_dict = sheet_to_dict(sheet)
print(data_dict)

Écrire des fichiers Excel avec openpyxl

La création et la modification de fichiers Excel sont tout aussi simples avec openpyxl.

Créer un classeur et écrire des données de base

from openpyxl import Workbook

# Create a new workbook
wb = Workbook()
sheet = wb.active

# Rename the sheet
sheet.title = "Data"

# Write values to cells
sheet["A1"] = "Name"
sheet["B1"] = "Age"
sheet["C1"] = "City"

# Add data
data = [
    ["Alice", 25, "New York"],
    ["Bob", 30, "San Francisco"],
    ["Charlie", 35, "Chicago"]
]

for row_idx, row_data in enumerate(data, start=2):
    for col_idx, cell_value in enumerate(row_data, start=1):
        sheet.cell(row=row_idx, column=col_idx, value=cell_value)

# Save the workbook
wb.save("new_workbook.xlsx")

Modifier des fichiers Excel existants

from openpyxl import load_workbook

# Load an existing workbook
wb = load_workbook("existing_file.xlsx")
sheet = wb.active

# Modify cell values
sheet["D1"] = "Updated Data"
sheet.cell(row=5, column=2).value = 42

# Save to a new file (to preserve the original)
wb.save("modified_file.xlsx")

Ajouter des données de manière dynamique

La méthode .append() permet d'ajouter facilement de nouvelles lignes :

from openpyxl import Workbook

wb = Workbook()
sheet = wb.active

# Add headers
sheet.append(["Date", "Product", "Quantity", "Price"])

# Add multiple rows of data
sales_data = [
    ["2025-04-01", "Laptop", 5, 1200],
    ["2025-04-01", "Mouse", 10, 25],
    ["2025-04-02", "Monitor", 3, 350]
]

for row in sales_data:
    sheet.append(row)

wb.save("sales_report.xlsx")

Formatage et style dans Excel

openpyxl offre des options étendues pour le formatage et le style des cellules.

Ajouter des polices, des bordures et des alignements

from openpyxl import Workbook
from openpyxl.styles import Font, Alignment, Border, Side, PatternFill, NamedStyle

wb = Workbook()
sheet = wb.active

# Create a header style
header_style = NamedStyle(name="header_style")
header_style.font = Font(bold=True, size=12, color="FFFFFF")
header_style.fill = PatternFill(fill_type="solid", start_color="366092")
header_style.alignment = Alignment(horizontal="center", vertical="center")
header_style.border = Border(
    bottom=Side(border_style="medium", color="000000"),
    left=Side(border_style="thin"),
    right=Side(border_style="thin"),
    top=Side(border_style="thin")
)

# Add the style to the workbook
wb.add_named_style(header_style)

# Apply the style to header row
headers = ["ID", "Product", "Category", "Price"]
for col_idx, header in enumerate(headers, start=1):
    cell = sheet.cell(row=1, column=col_idx, value=header)
    cell.style = "header_style"

# Basic styling without named styles
sheet["A2"].font = Font(bold=True, italic=True)
sheet["A3"].alignment = Alignment(horizontal="center")
sheet["A4"].border = Border(bottom=Side(border_style="thin"))

wb.save("styled_workbook.xlsx")

Mise en forme conditionnelle

La mise en forme conditionnelle vous permet d'appliquer des styles basés sur les valeurs des cellules :

from openpyxl import Workbook
from openpyxl.styles import Font, PatternFill
from openpyxl.styles.differential import DifferentialStyle
from openpyxl.formatting.rule import Rule, ColorScaleRule

wb = Workbook()
sheet = wb.active

# Add sample data
for row in range(1, 11):
    for col in range(1, 5):
        sheet.cell(row=row, column=col, value=(row-1)*4 + col)

# Add color scale (green to red gradient)
color_scale = ColorScaleRule(
    start_type="min", start_color="63BE7B",  # Green
    mid_type="percentile", mid_value=50, mid_color="FFEB84",  # Yellow
    end_type="max", end_color="F8696B"  # Red
)
sheet.conditional_formatting.add("A1:D10", color_scale)

# Add a rule for values less than 5
red_text = Font(color="FF0000")
red_fill = PatternFill(start_color="FFCCCC", end_color="FFCCCC", fill_type="solid")
dxf = DifferentialStyle(font=red_text, fill=red_fill)
rule = Rule(type="cellIs", operator="lessThan", formula=["5"], dxf=dxf)
sheet.conditional_formatting.add("A1:D10", rule)

wb.save("conditional_format.xlsx")

Fonctionnalités avancées

openpyxl prend en charge de nombreuses fonctionnalités avancées d'Excel qui facilitent les tâches complexes liées aux feuilles de calcul.

Ajouter des formules

from openpyxl import Workbook

wb = Workbook()
sheet = wb.active

# Add data
for row in range(1, 6):
    sheet.cell(row=row, column=1, value=row)

# Add formulas
sheet["B1"] = "=A1*2"
sheet["B2"] = "=A2*2"
sheet["C1"] = "=SUM(A1:A5)"
sheet["C2"] = "=AVERAGE(A1:A5)"
sheet["C3"] = "=COUNTIF(A1:A5,\">2\")"

wb.save("formulas.xlsx")

Note : Lorsque vous utilisez load_workbook(), les formules ne sont pas automatiquement calculées par openpyxl. Pour voir les valeurs calculées, utilisez load_workbook(“file.xlsx”, data_only=True).  

Insérer des graphiques

openpyxl peut créer différents types de graphiques :

from openpyxl import Workbook
from openpyxl.chart import BarChart, LineChart, Reference

wb = Workbook()
sheet = wb.active

# Add data
months = ["Jan", "Feb", "Mar", "Apr", "May"]
values = [30, 45, 37, 50, 62]

for i, (month, value) in enumerate(zip(months, values), start=1):
    sheet.cell(row=i, column=1, value=month)
    sheet.cell(row=i, column=2, value=value)

# Create a bar chart
bar_chart = BarChart()
bar_chart.title = "Monthly Sales"
bar_chart.x_axis.title = "Month"
bar_chart.y_axis.title = "Sales"

# Define the data range
data = Reference(sheet, min_col=2, min_row=1, max_row=5)
categories = Reference(sheet, min_col=1, min_row=1, max_row=5)

# Add the data to the chart
bar_chart.add_data(data)
bar_chart.set_categories(categories)

# Add the chart to the worksheet
sheet.add_chart(bar_chart, "D1")

# Create a line chart on the same data
line_chart = LineChart()
line_chart.title = "Monthly Sales Trend"
line_chart.add_data(data)
line_chart.set_categories(categories)
sheet.add_chart(line_chart, "D15")

wb.save("charts.xlsx")

Insérer des images

from openpyxl import Workbook
from openpyxl.drawing.image import Image

wb = Workbook()
sheet = wb.active

# Add an image
img = Image("logo.png")

# Resize the image (optional)
img.width = 150
img.height = 75

# Add the image to cell A1
sheet.add_image(img, "A1")

wb.save("with_image.xlsx")

Note : La bibliothèque Pillow doit être installée pour pouvoir travailler avec des images : pip install pillow

Gestion des feuilles, des lignes et des colonnes

openpyxl fournit des fonctions pour gérer la structure de vos fichiers Excel :

Création et suppression de feuilles

from openpyxl import Workbook

wb = Workbook()

# Create new sheets
wb.create_sheet("Data")
wb.create_sheet("Summary", 0)  # Add at the beginning

# Remove a sheet
wb.remove(wb["Sheet"])  # Remove the default sheet

print(wb.sheetnames)  # ['Summary', 'Data']

wb.save("multiple_sheets.xlsx")

Renommer des feuilles

wb = Workbook()
sheet = wb.active
sheet.title = "Sales Report"
wb.save("renamed_sheet.xlsx")

Copier des feuilles de travail

from openpyxl import Workbook

wb = Workbook()
source = wb.active
source.title = "Original"

# Add some data to copy
source["A1"] = "Test Data"

# Create a copy
wb.copy_worksheet(source)

# The copied sheet will have "Copy of Original" name
wb.save("copied_sheet.xlsx")

Insérer et supprimer des lignes et des colonnes

from openpyxl import Workbook

wb = Workbook()
sheet = wb.active

# Add some data
for i in range(1, 6):
    for j in range(1, 4):
        sheet.cell(row=i, column=j, value=f"R{i}C{j}")

# Insert a row at position 2
sheet.insert_rows(2)

# Insert multiple rows
sheet.insert_rows(5, 3)  # Insert 3 rows at position 5

# Insert a column at position 2
sheet.insert_cols(2)

# Delete rows
sheet.delete_rows(7, 2)  # Delete 2 rows starting at row 7

# Delete columns
sheet.delete_cols(3)  # Delete column C

wb.save("modified_structure.xlsx")

Gel des vitres et ajout de filtres

from openpyxl import Workbook

wb = Workbook()
sheet = wb.active

# Add headers
headers = ["ID", "Name", "Department", "Salary"]
for col_idx, header in enumerate(headers, start=1):
    sheet.cell(row=1, column=col_idx, value=header)

# Add data
data = [
    [1, "John Smith", "HR", 55000],
    [2, "Jane Doe", "IT", 65000],
    [3, "Bob Johnson", "Finance", 60000]
]
for row_idx, row_data in enumerate(data, start=2):
    for col_idx, value in enumerate(row_data, start=1):
        sheet.cell(row=row_idx, column=col_idx, value=value)

# Freeze the header row
sheet.freeze_panes = "A2"

# Add autofilter
sheet.auto_filter.ref = "A1:D4"

wb.save("freeze_and_filter.xlsx")

Limites et commentaires de la communauté

Bien qu'openpyxl soit riche en fonctionnalités, les utilisateurs ont noté quelques limitations :

  • Prise en charge limitée des plages nommées
  • Les exemples de documentation peuvent être rares pour les fonctions avancées
  • Les performances peuvent être lentes pour les fichiers très volumineux (bien que le mode lecture seule soit utile).

Malgré ces limitations, openpyxl bénéficie d'un soutien important de la part de la communauté. Les problèmes peuvent être signalés sur le tracker GitLab, et une assistance professionnelle est parfois disponible. Pour plus d'informations et d'aide, vous pouvez vous référer à :

Conclusion

openpyxl est une bibliothèque bien établie pour l'automatisation d'Excel basée sur Python qui offre un support complet pour la lecture, l'écriture et le style des fichiers Excel. Il permet un contrôle détaillé des résultats des feuilles de calcul dans les flux de travail automatisés, de la manipulation de cellules individuelles à la création de graphiques et à l'application d'un formatage complexe.

Pour les utilisateurs qui ont besoin de générer ou d'analyser des fichiers Excel de manière programmatique, en particulier lors de la création de rapports ou du traitement de données tabulaires, openpyxl fournit un ensemble d'outils complet. Sa capacité à fonctionner sans nécessiter l'installation d'Excel le rend particulièrement utile pour les environnements de serveurs et les pipelines de données automatisés.

Que vous créiez des modèles financiers, analysiez des données ou produisiez des rapports, openpyxl vous donne les outils nécessaires pour manipuler efficacement des fichiers Excel grâce au code Python.


Vinod Chugani's photo
Author
Vinod Chugani
LinkedIn

En tant que professionnel de la science des données, de l'apprentissage automatique et de l'IA générative, Vinod se consacre au partage des connaissances et à l'autonomisation des scientifiques des données en herbe pour qu'ils réussissent dans ce domaine dynamique.

Devenez développeur Python

Acquérir les compétences de programmation dont tous les développeurs Python ont besoin.
Commencez à apprendre gratuitement

FAQ sur openpyxl

Quels sont les types de fichiers pris en charge par openpyxl ?

openpyxl prend en charge plusieurs formats Excel, notamment .xlsx, .xlsm, .xltx et xltm. Il ne prend pas en charge l'ancien format .xls utilisé par Excel 2003 et les versions antérieures.

Openpyxl peut-il lire et évaluer des formules Excel ?

openpyxl peut lire et écrire des formules, mais il ne les évalue pas. Pour voir les résultats de la formule, le fichier doit d'abord être ouvert et enregistré dans Excel.

Faut-il que Microsoft Excel soit installé pour utiliser openpyxl ?

Non, openpyxl fonctionne entièrement en Python et ne nécessite pas l'installation d'Excel sur votre machine.

​Puis-je insérer des images dans Excel avec openpyxl ?

Oui, mais la bibliothèque Pillow doit être installée et le fichier image doit exister sur le disque lorsque vous appelez add_image().

Openpyxl est-il adapté aux fichiers Excel volumineux ?

Oui, surtout si vous utilisez le mode read_only=True, qui améliore les performances lors de la lecture de feuilles de calcul volumineuses.

Sujets

Apprenez avec DataCamp

Cursus

Associate Python Developer

0 min
Learn Python for software development, from writing functions to defining classes. Get the necessary skills to kickstart your developer career!
Afficher les détailsRight Arrow
Commencer le cours
Voir plusRight Arrow