Si cada semana o cada mes armas el mismo reporte en Excel — copiando datos de un sistema, limpiándolos a mano, sacando totales por producto o por vendedor, y dándole formato antes de enviarlo — esa tarea se puede automatizar por completo con Python. No hace falta ser programador: con un puñado de líneas reutilizables, ese reporte se genera solo, siempre igual de bien hecho, en segundos.
Esta guía muestra el camino completo: leer los datos de origen, limpiarlos, calcular el resumen, generar el archivo final con formato, y programar que todo esto corra solo, sin que tengas que acordarte de hacerlo.
Por qué vale la pena automatizarlo
Un reporte manual no solo consume tiempo — también es donde se cuelan los errores: una celda que se te olvidó actualizar, una fórmula que se rompió al copiar una fila, un filtro que quedó mal aplicado. Un script de Python hace exactamente lo mismo cada vez, sin cansarse y sin distraerse, y una vez armado sirve para siempre (o hasta que cambie la estructura del reporte).
Qué necesitas antes de empezar
Con Python instalado, solo hacen falta dos librerías: pandas (para leer, limpiar
y calcular) y openpyxl (para que pandas pueda leer y escribir archivos
.xlsx con formato). Se instalan así:
pip install pandas openpyxl
Paso 1 — Leer el archivo de origen
Todo empieza por cargar el Excel que hoy abres a mano. pandas lo convierte en una
tabla (un DataFrame) con la que se puede trabajar por código:
import pandas as pd
df = pd.read_excel("ventas_semana.xlsx", sheet_name="Datos")
print(df.head()) # primeras filas, para revisar que cargó bien
print(df.dtypes) # qué tipo de dato detectó en cada columna
Paso 2 — Limpiar y transformar los datos
Casi ningún reporte de origen llega perfecto: hay filas vacías, nombres de columna con espacios o mayúsculas inconsistentes, y fechas que a veces llegan como texto en vez de fecha real. Esto se resuelve una sola vez:
# Quitar filas sin producto o sin monto (datos incompletos)
df = df.dropna(subset=["Producto", "Monto"])
# Normalizar los nombres de columna: minúsculas, sin espacios
df.columns = [c.strip().lower().replace(" ", "_") for c in df.columns]
# Convertir la columna de fecha a un tipo fecha real
df["fecha"] = pd.to_datetime(df["fecha"], errors="coerce")
Paso 3 — Calcular el resumen
Aquí es donde antes perdías tiempo con tablas dinámicas armadas a mano. Con
groupby, el mismo cálculo (total por producto, ordenado de mayor a menor) sale en
una línea:
resumen = (
df.groupby("producto", as_index=False)["monto"]
.sum()
.sort_values("monto", ascending=False)
)
Paso 4 — Generar el reporte final con formato
El resultado se puede escribir directo a un nuevo Excel, ya con las columnas ajustadas al ancho del contenido, listo para enviar:
with pd.ExcelWriter("reporte_semanal.xlsx", engine="openpyxl") as writer:
resumen.to_excel(writer, sheet_name="Resumen", index=False)
hoja = writer.sheets["Resumen"]
for columna in hoja.columns:
ancho = max(len(str(celda.value)) for celda in columna) + 4
hoja.column_dimensions[columna[0].column_letter].width = ancho
Este es solo el primer paso
En el curso de Automatización con Python aprendes a conectar esto con correo, carpetas compartidas y más flujos reales de trabajo, con 13 módulos y ejercicios prácticos.
Paso 5 — Automatizar que se ejecute solo
El script ya funciona, pero todavía hay que correrlo a mano. El último paso es programar que el sistema operativo lo ejecute sin intervención.
En Windows, con el Programador de tareas (Task Scheduler), desde la terminal:
schtasks /create /tn "ReporteSemanalExcel" /tr "python C:\reportes\generar_reporte.py" /sc weekly /d MON /st 08:00
En macOS o Linux, con un cron job (mismo horario: lunes a las 8:00 a. m.):
0 8 * * 1 /usr/bin/python3 /home/usuario/reportes/generar_reporte.py
Errores comunes al empezar
- El archivo Excel abierto bloquea la escritura: si el reporte de salida está abierto en Excel mientras corre el script, Python no puede sobrescribirlo y lanza un error de permisos. Ciérralo antes de ejecutar (o antes de que corra la tarea programada).
- Rutas relativas en la tarea programada: lo que funciona al correr el script desde tu carpeta puede fallar cuando lo ejecuta el programador de tareas desde otra ubicación. Usa siempre la ruta completa del archivo.
- Columnas con tipos mezclados: si una columna de "monto" tiene alguna
celda con texto (por ejemplo, "N/A"), pandas la trata como texto completa y las sumas
fallan. Conviene revisar
df.dtypesantes de calcular cualquier total.
Siguiente paso
Con estos cinco pasos ya tienes un reporte que se genera y se actualiza solo. De ahí en adelante, el mismo patrón — leer, limpiar, calcular, exportar, programar — sirve para automatizar prácticamente cualquier reporte repetitivo: ventas, inventario, asistencia, cobranza. Si quieres profundizar con casos reales, integraciones con correo y control de errores, en ZENTIX tenemos el curso completo de Automatización con Python, con 13 módulos, ejercicios y certificado.