Gerar relatórios manualmente toda semana é um dos trabalhos mais fáceis de automatizar com Python. Neste tutorial você vai construir um pipeline que: (1) lê dados, (2) gera um arquivo .xlsx formatado e (3) envia por e-mail automaticamente. O código é adaptável para qualquer processo repetitivo que você tenha.
Pré-requisitos
- Python 3.8 ou superior instalado
- Bibliotecas:
openpyxlepandas(instale compip install openpyxl pandas) - Uma conta de e-mail com SMTP habilitado (Gmail com senha de aplicativo funciona bem)
Parte 1: gerando o arquivo Excel com openpyxl
O openpyxl é a biblioteca padrão para criar e editar arquivos .xlsx em Python. Veja um exemplo que gera um relatório de vendas:
import pandas as pd
from openpyxl import Workbook
from openpyxl.styles import Font, PatternFill, Alignment
from datetime import date
# Simula dados de vendas (na prática, leia do banco ou CSV)
df = pd.DataFrame({
'Produto': ['Notebook', 'Mouse', 'Teclado', 'Monitor'],
'Quantidade': [12, 45, 30, 8],
'Valor_Unit': [3200, 89, 159, 1100],
})
df['Total'] = df['Quantidade'] * df['Valor_Unit']
# Cria o workbook
wb = Workbook()
ws = wb.active
ws.title = 'Vendas'
# Cabeçalho com estilo
cabecalho = ['Produto', 'Quantidade', 'Valor Unitário', 'Total']
for col, titulo in enumerate(cabecalho, 1):
cell = ws.cell(row=1, column=col, value=titulo)
cell.font = Font(bold=True, color='FFFFFF')
cell.fill = PatternFill('solid', fgColor='1a3a6e')
cell.alignment = Alignment(horizontal='center')
# Dados
for row_idx, row in df.iterrows():
ws.append([row['Produto'], row['Quantidade'],
row['Valor_Unit'], row['Total']])
nome_arquivo = f'vendas_{date.today()}.xlsx'
wb.save(nome_arquivo)
print(f'Arquivo gerado: {nome_arquivo}')
Parte 2: enviando por e-mail com smtplib
Com o arquivo gerado, use smtplib (biblioteca nativa do Python) para enviar por e-mail:
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.base import MIMEBase
from email.mime.text import MIMEText
from email import encoders
def enviar_relatorio(destinatario, arquivo):
remetente = 'seu@email.com'
senha = 'sua_senha_de_aplicativo' # Use variável de ambiente em produção
msg = MIMEMultipart()
msg['From'] = remetente
msg['To'] = destinatario
msg['Subject'] = f'Relatório de Vendas — {date.today()}'
corpo = 'Segue em anexo o relatório de vendas da semana.'
msg.attach(MIMEText(corpo, 'plain', 'utf-8'))
# Anexa o arquivo Excel
with open(arquivo, 'rb') as f:
parte = MIMEBase('application', 'octet-stream')
parte.set_payload(f.read())
encoders.encode_base64(parte)
parte.add_header('Content-Disposition', f'attachment; filename="{arquivo}"')
msg.attach(parte)
with smtplib.SMTP_SSL('smtp.gmail.com', 465) as servidor:
servidor.login(remetente, senha)
servidor.send_message(msg)
print('E-mail enviado!')
enviar_relatorio('gestor@empresa.com', nome_arquivo)
Parte 3: automatizando a execução
Para rodar automaticamente toda semana, você tem duas opções:
- Windows: use o Agendador de Tarefas do Windows para executar o script toda segunda-feira às 7h.
- Linux/Mac: use cron. A expressão
0 7 * * 1significa "toda segunda-feira às 7h".
Em ambientes de produção, armazene senhas em variáveis de ambiente (os.environ.get('EMAIL_SENHA')) e nunca no código direto.
Perguntas frequentes
Posso enviar para vários destinatários?
Sim. Passe uma lista separada por vírgula em msg['To'] e use o mesmo valor no send_message().
O Gmail bloqueia envios automáticos?
Não, se você usar uma Senha de Aplicativo (gerada nas configurações de segurança da conta Google). Nunca use sua senha normal do Gmail no código.
Como adicionar várias abas no Excel?
Use wb.create_sheet('Nome da Aba') para cada aba adicional antes de salvar o arquivo.