>_ Black Engine

Automatizar Excel con Python: guía con ejemplos de código

Por Black Engine · 6 de noviembre de 2026

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 ejemplo 30 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 .xls antiguo o un CSV renombrado. Para .xls instala xlrd, 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 .xlsx y, 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:

  1. 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.
  2. 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).
  3. 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.
  4. 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.
  5. 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.

Pide ayuda por WhatsApp