Programma
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=Truemigliora le prestazioni per file di grandi dimensioni ma limita le possibilità di modifica -
data_only=Truerestituisce 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 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.


