Blog Automatización Python

Cómo Automatizar Reportes de Excel con Python (Código Completo)

Por Diego Alejandre 12 min lectura

📥 Descarga el código completo gratis

Te mando el script completo + ejemplos en Excel listos para usar. Sin spam.

Pierdes 2-3 horas cada día armando reportes de producción en Excel. Copias datos de un archivo, pegas en otro, actualizas tablas dinámicas, generas gráficas y mandas por correo.

¿Qué tal si todo eso se hiciera solo? En este tutorial te muestro cómo automatizar reportes de Excel con Python usando pandas, openpyxl y smtplib.

Al final vas a tener un script que:

Y todo con un solo comando. Vamos.

¿Qué necesitas antes de empezar?

Tres cosas:

  1. Python 3.8 o superior instalado en tu computadora (descárgalo aquí)
  2. Conocimientos básicos de Excel (saber qué es una celda, una fila, una columna)
  3. 15 minutos sin interrupciones

No necesitas ser programador. Voy a explicar cada línea de código.

📚 Recomendación: Aprende Python desde cero

📘

Automate the Boring Stuff with Python

El mejor libro para aprender Python aplicado a tareas reales. Incluye automatización de Excel, emails, PDFs y más.

Ver en Amazon →

Paso 1: Instalar las librerías necesarias

Abre tu terminal (CMD en Windows, Terminal en Mac/Linux) y ejecuta esto:

pip install pandas openpyxl matplotlib

Esto instala tres librerías:

Espera 30-60 segundos mientras se instalan. Listo.

Paso 2: Crear el script principal

Crea un archivo llamado reporte_automatico.py y pega este código:

import pandas as pd
import matplotlib.pyplot as plt
from datetime import datetime

# 1. Leer datos de Excel
df = pd.read_excel('datos_produccion.xlsx', sheet_name='Producción')

# 2. Limpiar datos
df['Fecha'] = pd.to_datetime(df['Fecha'])
df = df.dropna()  # Eliminar filas vacías

# 3. Calcular métricas
total_producido = df['Unidades'].sum()
promedio_diario = df.groupby('Fecha')['Unidades'].sum().mean()

# 4. Crear gráfica
plt.figure(figsize=(10, 6))
df.groupby('Fecha')['Unidades'].sum().plot(kind='bar')
plt.title('Producción Diaria')
plt.xlabel('Fecha')
plt.ylabel('Unidades')
plt.tight_layout()
plt.savefig('grafica_produccion.png')

# 5. Generar reporte
with pd.ExcelWriter('reporte_final.xlsx', engine='openpyxl') as writer:
    # Resumen
    resumen = pd.DataFrame({
        'Métrica': ['Total Producido', 'Promedio Diario'],
        'Valor': [total_producido, promedio_diario]
    })
    resumen.to_excel(writer, sheet_name='Resumen', index=False)
    
    # Datos completos
    df.to_excel(writer, sheet_name='Datos', index=False)

print('✓ Reporte generado: reporte_final.xlsx')

¿Qué hace este código?

Línea por línea:

  1. Línea 1-3: Importa las librerías que vamos a usar
  2. Línea 6: Lee el archivo Excel llamado datos_produccion.xlsx
  3. Línea 9-10: Limpia los datos (convierte fechas y elimina filas vacías)
  4. Línea 13-14: Calcula el total producido y el promedio diario
  5. Línea 17-23: Genera una gráfica de barras y la guarda como imagen
  6. Línea 26-34: Crea un nuevo Excel con dos hojas: Resumen y Datos

Paso 3: Probarlo con tus datos

Crea un archivo Excel llamado datos_produccion.xlsx con esta estructura:

Fecha Turno Unidades
2026-04-20 Matutino 500
2026-04-20 Vespertino 480
2026-04-21 Matutino 520

Guarda ambos archivos en la misma carpeta y ejecuta:

python reporte_automatico.py

Debería aparecer el mensaje ✓ Reporte generado: reporte_final.xlsx y tendrás dos archivos nuevos:

Paso 4: Enviarlo por correo automáticamente

Agrega este código al final del script:

import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.base import MIMEBase
from email.mime.text import MIMEText
from email import encoders

# Configuración
remitente = 'tu_correo@gmail.com'
contraseña = 'tu_contraseña_de_aplicacion'
destinatarios = ['jefe@empresa.com', 'gerente@empresa.com']

# Crear mensaje
msg = MIMEMultipart()
msg['From'] = remitente
msg['To'] = ', '.join(destinatarios)
msg['Subject'] = f'Reporte de Producción - {datetime.now().strftime("%d/%m/%Y")}'

# Cuerpo del email
cuerpo = f'''
Buen día,

Adjunto el reporte de producción generado automáticamente.

Total producido: {total_producido:,.0f} unidades
Promedio diario: {promedio_diario:,.0f} unidades

Saludos,
Sistema Automatizado
'''

msg.attach(MIMEText(cuerpo, 'plain'))

# Adjuntar Excel
with open('reporte_final.xlsx', 'rb') as archivo:
    adjunto = MIMEBase('application', 'octet-stream')
    adjunto.set_payload(archivo.read())
    encoders.encode_base64(adjunto)
    adjunto.add_header('Content-Disposition', 'attachment', filename='reporte_final.xlsx')
    msg.attach(adjunto)

# Enviar
try:
    servidor = smtplib.SMTP('smtp.gmail.com', 587)
    servidor.starttls()
    servidor.login(remitente, contraseña)
    servidor.send_message(msg)
    servidor.quit()
    print('✓ Email enviado exitosamente')
except Exception as e:
    print(f'✗ Error al enviar: {e}')

⚠️ Importante sobre contraseñas

No uses tu contraseña normal de Gmail. Genera una "Contraseña de aplicación" desde tu cuenta de Google. Es más seguro.

🎓 Curso recomendado: Python para Análisis de Datos

🎥

Python for Data Analysis con Pandas

Curso completo en español. Aprende pandas, Excel automatizado, visualización de datos y más. +15 horas de contenido.

Ver en Udemy →

Paso 5: Programar para que corra automáticamente

En Windows:

  1. Abre el "Programador de tareas" (búscalo en el menú inicio)
  2. Click en "Crear tarea básica"
  3. Nombre: "Reporte automático"
  4. Frecuencia: "Diariamente" a las 7:00 AM
  5. Acción: "Iniciar un programa"
  6. Programa: python
  7. Argumentos: C:\ruta\a\reporte_automatico.py

En Mac/Linux:

Usa cron. Edita el crontab con crontab -e y agrega:

0 7 * * * /usr/bin/python3 /ruta/a/reporte_automatico.py

Listo. A partir de mañana el reporte se genera y envía solo.

Errores comunes (y cómo solucionarlos)

1. "ModuleNotFoundError: No module named 'pandas'"

Solución: Instala pandas con pip install pandas

2. "FileNotFoundError: datos_produccion.xlsx"

Solución: Verifica que el archivo Excel esté en la misma carpeta que el script.

3. "SMTPAuthenticationError"

Solución: Asegúrate de usar una contraseña de aplicación de Google, no tu contraseña normal.

4. Las fechas aparecen como números raros

Solución: Agrega df['Fecha'] = pd.to_datetime(df['Fecha']) después de leer el Excel.

Próximos pasos

Ahora que tienes el script base funcionando, puedes expandirlo:

Si necesitas ayuda para implementar esto en tu planta o crear un sistema más robusto, escríbeme y lo platicamos.

📥 Descarga el código completo

Script listo para usar + archivo Excel de ejemplo + guía PDF

Sin spam. Puedes darte de baja cuando quieras.

Artículos Relacionados

Cómo Leer Datos de SQL Server con Python

Conecta Python a tu base de datos y automatiza consultas.

Generar PDFs Profesionales con Python

Crea reportes en PDF con gráficas y tablas automáticas.