Cómo Automatizar Reportes de Excel con Python (Código Completo)
📥 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:
- Lee datos de múltiples archivos Excel
- Limpia y procesa la información automáticamente
- Genera gráficas profesionales
- Crea un reporte consolidado en formato Excel
- Lo envía por correo a quien quieras
Y todo con un solo comando. Vamos.
¿Qué necesitas antes de empezar?
Tres cosas:
- Python 3.8 o superior instalado en tu computadora (descárgalo aquí)
- Conocimientos básicos de Excel (saber qué es una celda, una fila, una columna)
- 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:
- pandas: Para leer y manipular datos de Excel
- openpyxl: Para escribir archivos .xlsx
- matplotlib: Para generar gráficas
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:
- Línea 1-3: Importa las librerías que vamos a usar
- Línea 6: Lee el archivo Excel llamado
datos_produccion.xlsx - Línea 9-10: Limpia los datos (convierte fechas y elimina filas vacías)
- Línea 13-14: Calcula el total producido y el promedio diario
- Línea 17-23: Genera una gráfica de barras y la guarda como imagen
- 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:
reporte_final.xlsx— El reporte consolidadografica_produccion.png— La gráfica de barras
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:
- Abre el "Programador de tareas" (búscalo en el menú inicio)
- Click en "Crear tarea básica"
- Nombre: "Reporte automático"
- Frecuencia: "Diariamente" a las 7:00 AM
- Acción: "Iniciar un programa"
- Programa:
python - 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:
- Leer múltiples archivos: Usa
globpara procesar todas las carpetas de producción - Generar PDFs: Usa
reportlabpara crear reportes en PDF - Conectar a SQL Server: Lee datos directamente de tu base de datos con
pyodbc - Dashboard web: Usa
streamlitpara crear un dashboard interactivo
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.