Automatizar Excel con Python: guía con ejemplos de código
Para automatizar Excel con Python se usan sobre todo dos librerías gratuitas: pandas, para leer, limpiar y resumir datos, y openpyxl, para escribir archivos con formato, varias hojas y fórmulas. Con unas cuantas líneas puedes juntar decenas de archivos, generar reportes con estilo y dejarlo programado para que corra solo cada mañana. No necesitas tener Excel instalado para que funcione.
Preparación
Si aún no tienes Python, sigue los pasos de instalación en automatizar procesos con Python. Luego, en tu entorno virtual:
pip install pandas openpyxl
Leer un Excel
import pandas as pd
df = pd.read_excel("ventas.xlsx", sheet_name="Enero") # una hoja
todas = pd.read_excel("ventas.xlsx", sheet_name=None) # diccionario con todas las hojas
print(df.head()) # primeras filas
Si tus encabezados no están en la primera fila, usa header=2 (fila 3) o skiprows.
Limpiar y resumir datos
df["Fecha"] = pd.to_datetime(df["Fecha"], dayfirst=True)
df["Cliente"] = df["Cliente"].str.strip().str.upper()
df = df.dropna(subset=["Importe"])
resumen = (
df.groupby("Cliente", as_index=False)["Importe"]
.sum()
.sort_values("Importe", ascending=False)
)
Esto equivale a una tabla dinámica, pero repetible con un clic.
Escribir varias hojas en un solo archivo
with pd.ExcelWriter("reporte.xlsx", engine="openpyxl") as writer:
df.to_excel(writer, sheet_name="Detalle", index=False)
resumen.to_excel(writer, sheet_name="Resumen", index=False)
Dar formato con openpyxl
from openpyxl import load_workbook
from openpyxl.styles import Font, PatternFill
wb = load_workbook("reporte.xlsx")
ws = wb["Resumen"]
for celda in ws[1]: # encabezados en negritas con fondo
celda.font = Font(bold=True, color="FFFFFF")
celda.fill = PatternFill("solid", fgColor="1F4E78")
for fila in ws.iter_rows(min_row=2, min_col=2, max_col=2):
for celda in fila:
celda.number_format = '"$"#,##0.00' # formato de moneda
ws.column_dimensions["A"].width = 35
ws.freeze_panes = "A2" # inmovilizar encabezados
ultima = ws.max_row
ws[f"A{ultima + 1}"] = "TOTAL"
ws[f"B{ultima + 1}"] = f"=SUM(B2:B{ultima})" # fórmula que Excel calcula al abrir
wb.save("reporte.xlsx")
Nota: en openpyxl las fórmulas se escriben en inglés y con comas (SUM, no SUMA), aunque tu Excel esté en español; Excel las traduce al abrir.
Modificar un Excel existente sin perder su formato
Si tienes una plantilla con diseño y solo quieres llenar datos, no uses to_excel (reescribe la hoja). Usa openpyxl directamente:
from openpyxl import load_workbook
wb = load_workbook("plantilla_cotizacion.xlsx")
ws = wb["Cotización"]
partidas = [("Tornillo 1/4", 100, 2.5), ("Taquete 1/4", 100, 1.2)]
ws["B3"] = "Ferretería del Norte"
ws["B4"] = "2026-11-06"
for i, (producto, cantidad, precio) in enumerate(partidas, start=10):
ws[f"A{i}"], ws[f"D{i}"], ws[f"E{i}"] = producto, cantidad, precio
wb.save("cotizacion_ferreteria.xlsx")
Cuidado: openpyxl puede no conservar algunos elementos (por ejemplo, ciertos gráficos o imágenes) al guardar. Prueba con una copia de tu plantilla. Y si el archivo tiene macros, ábrelo con load_workbook("archivo.xlsm", keep_vba=True).
Consolidar muchos archivos
from pathlib import Path
import pandas as pd
archivos = sorted(Path("sucursales").glob("*.xlsx"))
datos = pd.concat(
(pd.read_excel(a).assign(Sucursal=a.stem) for a in archivos),
ignore_index=True,
)
datos.to_excel("consolidado.xlsx", index=False)
Programarlo para que corra solo
- Windows: Programador de tareas → Crear tarea básica → programa:
C:\ruta\.venv\Scripts\python.exe, argumentos:C:\ruta\reporte.py, “Iniciar en”: la carpeta del proyecto. - Mac/Linux: una línea en
crontab -e, por ejemplo30 7 * * 1-5 /ruta/.venv/bin/python /ruta/reporte.py(lunes a viernes, 7:30).
Para mandar el resultado por correo automáticamente, mira automatizar reportes en Excel.
Errores comunes
PermissionError: [Errno 13]: el archivo está abierto en Excel. Ciérralo.ValueError: Excel file format cannot be determined: el archivo es.xlsantiguo o un CSV renombrado. Para.xlsinstalaxlrd, o conviértelo a.xlsx.- Fechas como números (45231): conviértelas con
pd.to_datetime(col, unit="D", origin="1899-12-30"). - Ceros a la izquierda perdidos (códigos postales, claves): lee esas columnas como texto con
dtype={"CP": str}. - Fórmulas que muestran el valor viejo: openpyxl no recalcula; Excel lo hace al abrir el archivo.
Casos frecuentes en una oficina
Estos son los pedidos que más se repiten cuando alguien busca automatizar Excel con Python, y la pieza que resuelve cada uno:
- Cruzar dos archivos (el famoso BUSCARV): tienes la lista de facturas en un archivo y el catálogo de clientes en otro. En pandas se hace con
merge, que une las tablas por una columna común y te dice qué filas no encontraron pareja, algo que BUSCARV solo marca con#N/D. - Separar un archivo grande en uno por vendedor o sucursal: un ciclo sobre
df.groupby("Vendedor")que guarda cada grupo en su propio.xlsxy, si quieres, lo manda por correo a cada responsable. - Comparar el inventario de esta semana contra la anterior: unir ambos archivos por clave de producto y calcular diferencias. Ideal para detectar mermas o capturas mal hechas.
- Limpiar exportaciones de un sistema (ERP, banco, punto de venta): quitar filas de encabezado repetidas, renglones de “Subtotal”, espacios y montos que vienen como texto con signo de pesos.
facturas = pd.read_excel("facturas.xlsx")
clientes = pd.read_excel("clientes.xlsx", dtype={"RFC": str})
cruce = facturas.merge(clientes, on="RFC", how="left", indicator=True)
sin_cliente = cruce[cruce["_merge"] == "left_only"] # facturas sin cliente en catálogo
Qué revisar antes de dejarlo corriendo solo
Un script que funciona una vez en tu computadora no es lo mismo que uno que corre sin supervisión cada mañana. Antes de programarlo, revisa:
- Que los nombres de columnas no cambien. Si el sistema que genera el archivo cambia “Importe” por “Importe total”, el script falla. Valida al inicio que las columnas esperadas existan y, si no, que se detenga con un mensaje claro.
- Que nunca sobrescriba el archivo original. Lee de una carpeta de entrada y escribe en otra de salida, con la fecha en el nombre (
reporte_2026-11-06.xlsx). - Que deje registro. Un archivo de texto (log) con la hora, cuántas filas leyó y si hubo errores te ahorra horas cuando algo sale raro.
- Que avise si falla. Lo mínimo es un correo o mensaje cuando el script termina con error; si no, te enteras cuando alguien pregunta por el reporte.
- Que las rutas no dependan de tu usuario. Si el script apunta a
C:\Users\Ana\Escritorio, dejará de funcionar en otra máquina o en un servidor.
Alternativas a Python según tu caso
Python no siempre es la mejor respuesta. Compara antes de empezar:
| Opción | Conviene cuando… | Limitación |
|---|---|---|
| Power Query (integrado en Excel) | Limpias y combinas datos con clics y el resultado vive en el mismo libro | Se complica con lógica condicional o cuando hay que mandar archivos |
| Macros VBA | Todo pasa dentro de un libro y el equipo ya usa Excel de escritorio | Difícil de mantener; no corre en Excel web |
| xlwings (librería de Python) | Necesitas controlar Excel abierto: recalcular, correr macros existentes | Requiere Excel instalado en la máquina |
| pandas + openpyxl | Muchos archivos, datos grandes, correr en servidor o combinar con otras fuentes | Requiere instalar Python y mantener el script |
Microsoft también ofrece Python dentro de Excel en algunas versiones de Microsoft 365; la disponibilidad depende de tu plan y región, así que revísala en la documentación de Microsoft. Si lo que quieres es un flujo más amplio (correo, carpetas compartidas, aprobaciones), lee automatizar procesos con Power Automate.
Si no programas: usa IA para escribir el script
Describe a ChatGPT, Claude o Gemini tus columnas y el resultado que quieres, y pide un script con pandas/openpyxl. Pruébalo con una copia de tus archivos y pide que te explique cada línea. Otras alternativas sin código están en automatizar Excel con IA.
Cuándo pedir ayuda
Si tu reporte depende de muchos archivos, de datos de un sistema o de que corra sin falla todos los días, conviene construirlo con manejo de errores y alertas. En Black Engine automatizamos reportes y procesos en Excel con Python; escríbenos por WhatsApp y lo revisamos.
Preguntas frecuentes
¿Qué librería de Python uso para Excel?
pandas para leer, limpiar, filtrar y resumir datos; openpyxl para formato, fórmulas, varias hojas y archivos .xlsx con estilo. Muchas veces se usan juntas.
¿Python puede editar un Excel sin borrar el formato?
Sí, con openpyxl abriendo el archivo existente y modificando solo las celdas que necesitas. pandas, al escribir, reemplaza la hoja y pierde el formato.
¿Necesito tener Excel instalado para usar Python?
No. pandas y openpyxl leen y escriben archivos .xlsx directamente. Solo necesitas Excel si quieres controlar la aplicación abierta (por ejemplo, ejecutar macros o recalcular).
¿Python o macros de VBA?
VBA es práctico para automatizar dentro de un solo libro. Python es mejor para muchos archivos, datos grandes, combinar con otras fuentes y correr en un servidor.