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

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 = '[email protected]'
    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('[email protected]', nome_arquivo)

Parte 3: automatizando a execução

Para rodar automaticamente toda semana, você tem duas opções:

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.