Vai al contenuto principale

openpyxl: automatizza le attività di Excel con Python

Scopri come leggere, scrivere e formattare file Excel con openpyxl. Trova esempi pratici per lavorare con i formati Excel moderni (.xlsx) e funzioni avanzate.
· 8 min leggi

Scopri con l'IA

openpyxl è una libreria Python efficiente che ti permette di leggere e scrivere file Excel nei formati moderni basati su XML (.xlsx, .xlsm) introdotti con Excel 2007, con pieno supporto per le funzionalità avanzate a partire da Excel 2010. È nata come porting in Python di PHPExcel e continua a essere mantenuta da una community attiva di sviluppatori. La libreria è eccellente per l’automazione dei dati, la creazione di report e i flussi di formattazione, ed è particolarmente utile per chi deve lavorare con file Excel senza avere Excel installato sul proprio sistema.

Molte organizzazioni usano openpyxl per automatizzare report finanziari, generare grafici da esportazioni di database e applicare formule e formattazioni a report di marketing. Questa libreria offre un controllo granulare sui file Excel interamente tramite codice Python.

Che cos’è openpyxl?

openpyxl è progettata specificamente per fornire supporto nativo ai formati di Excel 2010 e successivi. La libreria lavora con diversi formati di file:

  •  .xlsx - Cartella di lavoro Excel

  •  .xlsm - Cartella di lavoro Excel con macro

  •  .xltx - Modello Excel

  •  .xltm - Modello Excel con macro

Un grande vantaggio di openpyxl è che non richiede l’installazione di Excel sul computer. Questo la rende ideale per ambienti server, sistemi di reporting automatizzati e pipeline di elaborazione dati. Diverse altre librerie Python, inclusa pandas, usano openpyxl come interfaccia per Excel, a testimonianza della sua affidabilità e funzionalità.

Installare e importare openpyxl

L’installazione di openpyxl è semplice con pip:

pip install openpyxl

Per una maggiore sicurezza quando lavori con file provenienti da fonti non attendibili, puoi anche installare il pacchetto opzionale defusedxml:

pip install defusedxml

Per usare openpyxl negli script Python, importa le classi necessarie:

from openpyxl import Workbook, load_workbook

Concetti chiave e terminologia

Per usare openpyxl in modo efficace, è utile comprendere la struttura di base di Excel:

  • Workbook: Il file Excel vero e proprio, che contiene uno o più fogli di lavoro
  • Worksheet: Le singole schede/fogli all’interno di una cartella di lavoro
  • Cell: Punti dati individuali in un foglio di lavoro, identificati da lettera di colonna e numero di riga (es. "A1")
  • Row: Riga orizzontale di celle, identificata da numeri (1, 2, 3...)
  • Column: Colonna verticale di celle, identificata da lettere (A, B, C...)

In openpyxl puoi fare riferimento alle celle usando:

  • Riferimenti in stile Excel: sheet[“A1”]

  • Indicizzazione riga-colonna: sheet.cell(row=1, column=1) (Nota: openpyxl usa indicizzazione a base 1, non a base 0)

Lettura di file Excel con openpyxl

Ecco un esempio pratico che mostra come leggere dati da un file Excel:

Carica ed esplora una cartella di lavoro

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

I parametri opzionali controllano come viene caricata la cartella di lavoro:

  • read_only=True migliora le prestazioni per file di grandi dimensioni ma limita le possibilità di modifica

  • data_only=True restituisce i valori calcolati invece delle formule

Iterare tra i dati

Per elaborare più celle in modo efficiente, usa i metodi di iterazione:

# 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)

Convertire in strutture dati Python

Puoi trasformare facilmente i dati di Excel in strutture dati 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)

Scrittura di file Excel con openpyxl

Creare e modificare file Excel è altrettanto semplice con openpyxl.

Crea una cartella di lavoro e scrivi dati di 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")

Modificare file Excel esistenti

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")

Aggiungere dati in modo dinamico

Il metodo .append() rende semplice aggiungere nuove righe:

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")

Formattazione e stile in Excel

openpyxl offre ampie opzioni per la formattazione e lo stile delle celle.

Aggiungere font, bordi e allineamenti

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")

Formattazione condizionale

La formattazione condizionale consente di applicare stili in base ai valori delle celle:

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")

Funzionalità avanzate

openpyxl supporta molte funzionalità avanzate di Excel che aiutano nelle attività complesse sui fogli di calcolo.

Aggiungere formule

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")

Nota: quando usi load_workbook(), le formule non vengono calcolate automaticamente da openpyxl. Per vedere i valori calcolati, usa load_workbook(“file.xlsx”, data_only=True).  

Inserire grafici

openpyxl può creare vari tipi di grafici:

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")

Inserire immagini

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")

Nota: per lavorare con le immagini devi avere installata la libreria Pillow: pip install pillow

Gestione di fogli, righe e colonne

openpyxl fornisce funzioni per gestire la struttura dei tuoi file Excel:

Creare e rimuovere fogli

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")

Rinominare i fogli

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

Copiare i fogli di lavoro

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")

Inserire ed eliminare righe e colonne

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")

Bloccare riquadri e aggiungere filtri

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")

Limitazioni e feedback della community

Sebbene openpyxl sia ricca di funzionalità, gli utenti hanno segnalato alcune limitazioni:

  • Supporto limitato per gli intervalli denominati
  • Gli esempi nella documentazione possono essere scarsi per le funzioni avanzate
  • Le prestazioni possono essere lente con file molto grandi (anche se la modalità sola lettura aiuta)

Nonostante queste limitazioni, openpyxl ha un forte supporto dalla community. I problemi possono essere segnalati sul tracker di GitLab e talvolta è disponibile supporto professionale. Per ulteriori informazioni e assistenza, puoi consultare:

Conclusione

openpyxl è una libreria consolidata per l’automazione di Excel con Python che offre supporto completo per lettura, scrittura e formattazione dei file Excel. Consente un controllo dettagliato sull’output dei fogli di calcolo nei flussi di lavoro automatizzati, dalla manipolazione delle singole celle alla creazione di grafici e all’applicazione di formattazioni complesse.

Per chi deve generare o analizzare file Excel in modo programmatico, in particolare per creare report o elaborare dati tabellari, openpyxl offre un set di strumenti completo. La possibilità di funzionare senza richiedere l’installazione di Excel la rende particolarmente preziosa per ambienti server e pipeline di dati automatizzate.

Che tu stia creando modelli finanziari, analizzando dati o generando report, openpyxl ti dà gli strumenti per gestire i file Excel in modo efficiente tramite codice Python.

Vinod Chugani

Autore

Vinod Chugani

Vinod Chugani ha iniziato la sua carriera a Tokyo come il più giovane Head dell'Hedge Fund Sales Desk di JPMorgan e in seguito ha stabilito un record personale di vendite a Lehman Brothers, poi ha costruito un'attività di distribuzione di elettronica in 30 paesi superando i 100 milioni di SG$ di fatturato prima di passare ai dati. Laureato in Economia alla Duke e diplomato alla NYC Data Science Academy, è stato uno dei tre beneficiari di borsa di studio su oltre 100 candidati per il corso Building AI Applications di Hugo Bowne-Anderson su Maven. Oggi scrive per DataCamp, KDnuggets, Machine Learning Mastery e Statology su argomenti che vanno dalla statistica all'AI agentica, e fa da mentor a professionisti dei dati alla NYC Data Science Academy con oltre 1.000 sessioni one-to-one all'attivo.

 

FAQ su openpyxl

Quali tipi di file supporta openpyxl?

openpyxl supporta diversi formati di Excel, tra cui .xlsx, .xlsm, .xltx e xltm. Non supporta il vecchio formato .xls usato da Excel 2003 e precedenti.

openpyxl può leggere e valutare le formule di Excel?

openpyxl può leggere e scrivere formule, ma non le valuta. Per vedere i risultati delle formule, il file deve prima essere aperto e salvato in Excel.

Devo avere Microsoft Excel installato per usare openpyxl?

No, openpyxl funziona interamente in Python e non richiede che Excel sia installato sul tuo computer.

Posso inserire immagini in Excel con openpyxl?

Sì, ma devi avere installata la libreria Pillow e il file immagine deve esistere sul disco quando chiami add_image().

openpyxl è adatto a file Excel di grandi dimensioni?

Sì, soprattutto usando la modalità read_only=True, che migliora le prestazioni in lettura su fogli di calcolo di grandi dimensioni.

Argomenti

Correlato