Plataforma / Guias / Python para Excel

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 ExcelSolução com Python
Arquivos > 1M linhasPandas processa milhões
Tarefas repetitivasScripts automatizados
Cálculos complexosBibliotecas estatísticas
Múltiplos arquivosLoop em diretórios
Integração com APIsRequests + 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
BibliotecaUso
pandasManipulação de dados (DataFrames)
openpyxlLer/escrever Excel (.xlsx) com formatação
xlsxwriterCriar Excel com gráficos e formatação
xlrdLer arquivos antigos (.xls)
numpyCá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.py

Executar 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

  1. → Guia 8.3: Power Query para Finanças
  2. → Guia 8.4: Dashboards Financeiros
  3. → Template: Script de Consolidação
Dúvida neste guia? O consultor conhece este conteúdo e a Biblioteca.Perguntar ao Consultor
← Todos os guias