Python para Excel
Metodologiaavançado~30 min
🐍 Python para Excel em Finanças
🎯 Objetivo
Usar Python para automatizar tarefas do Excel, processar grandes volumes de dados e criar análises avançadas.
📌 Por Que Python + Excel?
| Limitação do Excel | Solução com Python |
|---|---|
| Arquivos > 1M linhas | Pandas processa milhões |
| Tarefas repetitivas | Scripts automatizados |
| Cálculos complexos | Bibliotecas estatísticas |
| Múltiplos arquivos | Loop em diretórios |
| Integração com APIs | Requests + JSON |
🛠️ Bibliotecas Essenciais
# Instalar via pip
pip install pandas openpyxl xlsxwriter xlrd
# Importações básicas
import pandas as pd
import numpy as np
from pathlib import Path
from datetime import datetime| Biblioteca | Uso |
|---|---|
| pandas | Manipulação de dados (DataFrames) |
| openpyxl | Ler/escrever Excel (.xlsx) com formatação |
| xlsxwriter | Criar Excel com gráficos e formatação |
| xlrd | Ler arquivos antigos (.xls) |
| numpy | Cálculos numéricos |
📥 Lendo Arquivos Excel
Leitura Básica
# Ler arquivo
df = pd.read_excel('balancete.xlsx')
# Especificar aba
df = pd.read_excel('balancete.xlsx', sheet_name='Janeiro')
# Ler todas as abas
dfs = pd.read_excel('balancete.xlsx', sheet_name=None)
# Retorna dicionário: {'Janeiro': df1, 'Fevereiro': df2, ...}
# Pular linhas (header não está na linha 1)
df = pd.read_excel('relatorio.xlsx', skiprows=3)
# Especificar colunas
df = pd.read_excel('dados.xlsx', usecols=['Conta', 'Saldo'])Ler Múltiplos Arquivos
from pathlib import Path
# Ler todos os Excel de uma pasta
pasta = Path('balancetes/')
arquivos = pasta.glob('*.xlsx')
# Consolidar em um único DataFrame
dfs = []
for arquivo in arquivos:
df = pd.read_excel(arquivo)
df['Arquivo'] = arquivo.stem # Nome do arquivo
dfs.append(df)
consolidado = pd.concat(dfs, ignore_index=True)📤 Escrevendo Arquivos Excel
Escrita Básica
# Salvar DataFrame
df.to_excel('saida.xlsx', index=False)
# Múltiplas abas
with pd.ExcelWriter('relatorio.xlsx') as writer:
df_receitas.to_excel(writer, sheet_name='Receitas', index=False)
df_despesas.to_excel(writer, sheet_name='Despesas', index=False)
df_resumo.to_excel(writer, sheet_name='Resumo', index=False)Com Formatação (openpyxl)
from openpyxl import Workbook
from openpyxl.styles import Font, PatternFill, Alignment, Border, Side
from openpyxl.utils.dataframe import dataframe_to_rows
wb = Workbook()
ws = wb.active
ws.title = "Relatório"
# Estilos
header_font = Font(bold=True, color='FFFFFF')
header_fill = PatternFill('solid', fgColor='1F4E79')
# Adicionar dados
for r_idx, row in enumerate(dataframe_to_rows(df, index=False, header=True), 1):
for c_idx, value in enumerate(row, 1):
cell = ws.cell(row=r_idx, column=c_idx, value=value)
if r_idx == 1: # Header
cell.font = header_font
cell.fill = header_fill
# Ajustar largura das colunas
for column in ws.columns:
max_length = max(len(str(cell.value or '')) for cell in column)
ws.column_dimensions[column[0].column_letter].width = max_length + 2
wb.save('relatorio_formatado.xlsx')🔄 Transformações Comuns
Limpeza de Dados
# Remover linhas vazias
df = df.dropna(how='all')
# Remover duplicatas
df = df.drop_duplicates()
# Preencher valores nulos
df['Coluna'] = df['Coluna'].fillna(0)
# Remover espaços em branco
df['Texto'] = df['Texto'].str.strip()
# Converter tipos
df['Valor'] = pd.to_numeric(df['Valor'], errors='coerce')
df['Data'] = pd.to_datetime(df['Data'], format='%d/%m/%Y')Agregações
# Soma por categoria
resumo = df.groupby('Conta')['Valor'].sum()
# Múltiplas agregações
resumo = df.groupby('Centro de Custo').agg({
'Valor': ['sum', 'mean', 'count'],
'Quantidade': 'sum'
})
# Tabela dinâmica
pivot = pd.pivot_table(
df,
values='Valor',
index='Conta',
columns='Mês',
aggfunc='sum',
fill_value=0
)Merge (PROCV do Python)
# Equivalente ao PROCV
resultado = pd.merge(
df_lancamentos,
df_plano_contas,
on='Codigo_Conta', # Coluna chave
how='left' # left, right, inner, outer
)📊 Casos de Uso em Finanças
1. Consolidação de Balancetes
import pandas as pd
from pathlib import Path
def consolidar_balancetes(pasta: str, output: str):
"""Consolida todos os balancetes de uma pasta."""
arquivos = Path(pasta).glob('*.xlsx')
dfs = []
for arquivo in arquivos:
df = pd.read_excel(arquivo)
# Extrair mês do nome do arquivo (ex: "Jan_2024.xlsx")
df['Periodo'] = arquivo.stem
dfs.append(df)
consolidado = pd.concat(dfs, ignore_index=True)
# Criar tabela dinâmica
pivot = pd.pivot_table(
consolidado,
values='Saldo',
index='Conta',
columns='Periodo',
aggfunc='sum',
fill_value=0
)
pivot.to_excel(output)
print(f"Consolidado salvo em {output}")
return pivot
# Uso
resultado = consolidar_balancetes('balancetes/', 'consolidado_2024.xlsx')2. Análise de Aging
def calcular_aging(df: pd.DataFrame, col_vencimento: str, col_valor: str):
"""Calcula aging de recebíveis."""
hoje = pd.Timestamp.today()
df['Dias_Atraso'] = (hoje - df[col_vencimento]).dt.days
# Classificar em faixas
bins = [-float('inf'), 0, 30, 60, 90, 180, float('inf')]
labels = ['A Vencer', '1-30', '31-60', '61-90', '91-180', '>180']
df['Faixa'] = pd.cut(df['Dias_Atraso'], bins=bins, labels=labels)
# Resumo
aging = df.groupby('Faixa')[col_valor].sum()
aging_pct = aging / aging.sum() * 100
resultado = pd.DataFrame({
'Valor': aging,
'%': aging_pct.round(1)
})
return resultado
# Uso
df = pd.read_excel('contas_receber.xlsx')
aging = calcular_aging(df, 'Data_Vencimento', 'Valor')
print(aging)3. Análise Real vs. Orçado
def analise_variancia(real_path: str, orcado_path: str, output: str):
"""Compara real vs orçado e calcula variâncias."""
real = pd.read_excel(real_path)
orcado = pd.read_excel(orcado_path)
# Merge
comparativo = pd.merge(
real, orcado,
on=['Conta', 'Centro_Custo'],
suffixes=('_Real', '_Orcado')
)
# Calcular variância
comparativo['Variancia_$'] = comparativo['Valor_Real'] - comparativo['Valor_Orcado']
comparativo['Variancia_%'] = (comparativo['Variancia_$'] / comparativo['Valor_Orcado'] * 100).round(1)
# Ordenar por maior impacto
comparativo = comparativo.sort_values('Variancia_$', key=abs, ascending=False)
comparativo.to_excel(output, index=False)
return comparativo
# Uso
variancia = analise_variancia('real_jan.xlsx', 'orcado_jan.xlsx', 'variancia_jan.xlsx')4. Gerador de Relatório Automático
def gerar_relatorio_mensal(dados_path: str, mes: str, output: str):
"""Gera relatório mensal formatado."""
from openpyxl import Workbook
from openpyxl.chart import BarChart, Reference
df = pd.read_excel(dados_path)
df_mes = df[df['Mes'] == mes]
wb = Workbook()
ws = wb.active
ws.title = f"Relatório {mes}"
# Título
ws['A1'] = f"RELATÓRIO FINANCEIRO - {mes.upper()}"
ws['A1'].font = Font(bold=True, size=16)
# KPIs
receita = df_mes[df_mes['Tipo'] == 'Receita']['Valor'].sum()
despesa = df_mes[df_mes['Tipo'] == 'Despesa']['Valor'].sum()
lucro = receita - despesa
ws['A3'] = "Receita Total:"
ws['B3'] = receita
ws['A4'] = "Despesa Total:"
ws['B4'] = despesa
ws['A5'] = "Lucro:"
ws['B5'] = lucro
# Dados detalhados a partir da linha 8
for r_idx, row in enumerate(dataframe_to_rows(df_mes, index=False, header=True), 8):
for c_idx, value in enumerate(row, 1):
ws.cell(row=r_idx, column=c_idx, value=value)
wb.save(output)
print(f"Relatório salvo: {output}")
# Uso
gerar_relatorio_mensal('dados_2024.xlsx', 'Janeiro', 'relatorio_jan.xlsx')🚀 Automação com Scripts
Estrutura de Projeto
projeto_financeiro/
├── data/
│ ├── input/ # Arquivos de entrada
│ └── output/ # Arquivos gerados
├── scripts/
│ ├── consolidar.py
│ ├── analisar.py
│ └── relatorio.py
├── requirements.txt
└── main.pyExecutar Automaticamente
# main.py
from scripts import consolidar, analisar, relatorio
if __name__ == "__main__":
print("Iniciando processamento...")
# 1. Consolidar dados
consolidar.run()
# 2. Analisar variâncias
analisar.run()
# 3. Gerar relatório
relatorio.run()
print("Concluído!")Agendar no Windows: Task Scheduler Agendar no Mac/Linux: cron
📚 Próximos Passos
- → Guia 8.3: Power Query para Finanças
- → Guia 8.4: Dashboards Financeiros
- → Template: Script de Consolidação
Dúvida neste guia? O consultor conhece este conteúdo e a Biblioteca.Perguntar ao Consultor