Guide
Come leggere un file Excel con Python e openpyxl
18 Aprile 2026
Autore: Nicodemo Bonofiglio
⏱ 5 min lettura
9/10
★★★★☆
Aprire un file Excel con Python è una delle automazioni più richieste in ufficio. Con openpyxl e pandas puoi leggere, modificare e creare file Excel senza aprire Microsoft Office — ideale per report automatici, elaborazione dati in batch e integrazione con altri sistemi. Questa guida ti mostra tutto da zero.
Installazione: pip install openpyxl pandas — entrambe le librerie in un solo comando.
openpyxl vs pandas — quale usare
| Libreria | Meglio per | Limitazioni |
| openpyxl | Leggere/scrivere celle, formattazione, grafici, formule | Più lenta su file grandi |
| pandas | Analisi dati, filtri, aggregazioni, file grandi | Non gestisce formattazione avanzata |
Regola pratica: usa pandas per leggere e analizzare dati, openpyxl per modificare formattazione e scrivere con stile.
Lettura base con pandas — il modo più veloce
import pandas as pd
# Leggi il primo foglio
df = pd.read_excel(“dati.xlsx”)
print(df.head()) # Mostra le prime 5 righe
print(df.shape) # (righe, colonne)
print(df.columns.tolist()) # Lista dei nomi colonne
# Leggi un foglio specifico per nome
df = pd.read_excel(“dati.xlsx”, sheet_name=”Vendite”)
# Leggi tutti i fogli in un dizionario
fogli = pd.read_excel(“dati.xlsx”, sheet_name=None)
for nome, df in fogli.items():
print(f”Foglio ‘{nome}’: {len(df)} righe”)
Operazioni comuni sui dati Excel
import pandas as pd
df = pd.read_excel(“vendite.xlsx”)
# Filtrare righe
df_nord = df[df[‘Regione’] == ‘Nord’]
df_alto = df[df[‘Importo’] > 10000]
# Filtrare con più condizioni
df_filtro = df[(df[‘Regione’] == ‘Nord’) & (df[‘Mese’] == ‘Gennaio’)]
# Somme e statistiche
print(df[‘Importo’].sum()) # Totale
print(df[‘Importo’].mean()) # Media
print(df[‘Importo’].max()) # Massimo
print(df.groupby(‘Regione’)[‘Importo’].sum()) # Totale per regione
# Ordinare
df_ordinato = df.sort_values(‘Importo’, ascending=False)
# Aggiungere una colonna calcolata
df[‘IVA’] = df[‘Importo’] * 0.22
df[‘Totale’] = df[‘Importo’] + df[‘IVA’]
Scrivere/modificare Excel con openpyxl
from openpyxl import load_workbook
from openpyxl.styles import Font, PatternFill, Alignment
from openpyxl.utils import get_column_letter
# Apri file esistente
wb = load_workbook(“report.xlsx”)
ws = wb.active
# Leggi una cella specifica
valore = ws[‘B2’].value
valore = ws.cell(row=2, column=2).value
# Scrivi in una cella
ws[‘A1’] = “Titolo Report”
ws.cell(row=1, column=1).value = “Titolo Report”
# Formattazione
ws[‘A1’].font = Font(bold=True, size=14, color=”FFFFFF”)
ws[‘A1’].fill = PatternFill(fill_type=”solid”, fgColor=”0066CC”)
ws[‘A1’].alignment = Alignment(horizontal=”center”)
# Larghezza colonna automatica
for col in ws.columns:
max_len = max(len(str(cell.value or “”)) for cell in col)
ws.column_dimensions[get_column_letter(col[0].column)].width = max_len + 4
wb.save(“report_modificato.xlsx”)
Caso d’uso completo — Report automatico da dati
import pandas as pd
from openpyxl import Workbook
from openpyxl.styles import Font, PatternFill, Alignment
from openpyxl.utils import get_column_letter
from datetime import date
def crea_report(dati_path, output_path):
# Leggi dati
df = pd.read_excel(dati_path)
# Elabora
totale_per_regione = df.groupby(‘Regione’)[‘Vendite’].sum().reset_index()
totale_per_regione = totale_per_regione.sort_values(‘Vendite’, ascending=False)
# Crea nuovo workbook
wb = Workbook()
ws = wb.active
ws.title = “Report Vendite”
# Intestazione
ws[‘A1’] = f”Report Vendite — {date.today().strftime(‘%d/%m/%Y’)}”
ws[‘A1’].font = Font(bold=True, size=16)
ws.merge_cells(‘A1:C1’)
# Header tabella (riga 3)
headers = [‘Regione’, ‘Vendite Totali’, ‘% sul totale’]
for i, h in enumerate(headers, 1):
cell = ws.cell(row=3, column=i, value=h)
cell.font = Font(bold=True, color=”FFFFFF”)
cell.fill = PatternFill(fill_type=”solid”, fgColor=”0F1923″)
cell.alignment = Alignment(horizontal=”center”)
# Dati
totale = totale_per_regione[‘Vendite’].sum()
for idx, row in totale_per_regione.iterrows():
r = idx + 4
ws.cell(row=r, column=1).value = row[‘Regione’]
ws.cell(row=r, column=2).value = row[‘Vendite’]
ws.cell(row=r, column=2).number_format = ‘€ #,##0.00’
ws.cell(row=r, column=3).value = round(row[‘Vendite’] / totale * 100, 1)
ws.cell(row=r, column=3).number_format = ‘0.0%’
# Larghezza automatica colonne
for col in ws.columns:
max_len = max(len(str(c.value or “”)) for c in col)
ws.column_dimensions[get_column_letter(col[0].column)].width = max_len + 4
wb.save(output_path)
print(f”Report salvato in: {output_path}”)
crea_report(“vendite.xlsx”, “report_finale.xlsx”)
Gestire file Excel grandi — modalità read_only
from openpyxl import load_workbook
# Modalità read_only — molto più veloce su file grandi
wb = load_workbook(“file_grande.xlsx”, read_only=True)
ws = wb.active
for row in ws.iter_rows(min_row=2, values_only=True):
# Processa ogni riga senza caricare tutto in memoria
codice, nome, importo = row[0], row[1], row[2]
if importo and importo > 10000:
print(f”{nome}: €{importo:,.2f}”)
wb.close()
Errori comuni e soluzioni
FileNotFoundError
Il file non esiste nel percorso indicato. Usa os.path.abspath("file.xlsx") per vedere il percorso completo.
openpyxl.utils.exceptions.InvalidFileException
Stai cercando di aprire un file .xls (vecchio formato) con openpyxl. Usa pd.read_excel("file.xls", engine="xlrd") invece.
PermissionError
Il file è aperto in Excel. Chiudi Excel prima di eseguire lo script Python.
Conclusione
Con pandas e openpyxl puoi automatizzare qualsiasi operazione su file Excel: lettura, filtro, aggregazione, formattazione e scrittura. Il caso d’uso più comune in ufficio è il report automatico: leggi i dati, elaborali con pandas, scrivi un Excel formattato con openpyxl e invialo via email con smtplib — tutto automaticamente ogni mattina.
Lascia un commento
Devi essere connesso per inviare un commento.