Python e Excel com OpenPyXL

Domine a manipulacao de planilhas Excel com Python e OpenPyXL. Aprenda a criar, ler, formatar e automatizar relatorios complexos.

4 min de leitura Equipe Python Brasil

Manipular planilhas Excel e uma das tarefas mais comuns no dia a dia de profissionais que trabalham com dados. Com Python e a biblioteca OpenPyXL, voce pode automatizar a criacao de relatorios, processar grandes volumes de dados e gerar planilhas formatadas profissionalmente. Neste artigo, vamos explorar desde operacoes basicas ate tecnicas avancadas.

Instalacao e Primeiros Passos

Instale o OpenPyXL com pip:

pip install openpyxl

Vamos comecar criando uma planilha simples:

from openpyxl import Workbook

wb = Workbook()
ws = wb.active
ws.title = "Vendas"

# Cabecalhos
cabecalhos = ["Produto", "Quantidade", "Preco Unitario", "Total"]
ws.append(cabecalhos)

# Dados
vendas = [
    ("Notebook", 15, 3500.00),
    ("Mouse", 120, 45.90),
    ("Teclado", 80, 129.90),
    ("Monitor", 30, 1899.00),
    ("Headset", 65, 199.90),
]

for produto, qtd, preco in vendas:
    ws.append([produto, qtd, preco, qtd * preco])

wb.save("relatorio_vendas.xlsx")
print("Planilha criada com sucesso!")

Lendo Planilhas Existentes

Para ler e processar dados de uma planilha existente:

from openpyxl import load_workbook

wb = load_workbook("relatorio_vendas.xlsx")
ws = wb.active

# Ler todas as linhas
print(f"Planilha: {ws.title}")
print(f"Dimensoes: {ws.dimensions}")
print()

for linha in ws.iter_rows(min_row=2, values_only=True):
    produto, qtd, preco, total = linha
    print(f"{produto}: {qtd} unidades x R$ {preco:.2f} = R$ {total:.2f}")

# Acessar celulas especificas
print(f"\nPrimeiro produto: {ws['A2'].value}")
print(f"Total da primeira venda: {ws['D2'].value}")

Voce tambem pode iterar por colunas e acessar intervalos:

# Somar todos os totais
totais = []
for celula in ws["D"]:
    if celula.row > 1 and celula.value is not None:
        totais.append(celula.value)

print(f"Soma dos totais: R$ {sum(totais):,.2f}")

Formatacao Profissional

O OpenPyXL permite aplicar estilos completos as celulas:

from openpyxl.styles import Font, PatternFill, Alignment, Border, Side, numbers

def formatar_planilha(ws):
    """Aplica formatacao profissional a planilha."""
    # Estilo do cabecalho
    cabecalho_font = Font(bold=True, color="FFFFFF", size=12)
    cabecalho_fill = PatternFill(start_color="2F5496", end_color="2F5496", fill_type="solid")
    cabecalho_align = Alignment(horizontal="center", vertical="center")

    borda = Border(
        left=Side(style="thin"),
        right=Side(style="thin"),
        top=Side(style="thin"),
        bottom=Side(style="thin"),
    )

    # Aplicar estilo ao cabecalho
    for celula in ws[1]:
        celula.font = cabecalho_font
        celula.fill = cabecalho_fill
        celula.alignment = cabecalho_align
        celula.border = borda

    # Formatar dados
    for linha in ws.iter_rows(min_row=2, max_row=ws.max_row):
        for celula in linha:
            celula.border = borda
            celula.alignment = Alignment(horizontal="center")

        # Formatar colunas de valor como moeda
        if linha[2].value is not None:
            linha[2].number_format = 'R$ #,##0.00'
        if linha[3].value is not None:
            linha[3].number_format = 'R$ #,##0.00'

    # Ajustar largura das colunas
    ws.column_dimensions["A"].width = 20
    ws.column_dimensions["B"].width = 15
    ws.column_dimensions["C"].width = 18
    ws.column_dimensions["D"].width = 18

formatar_planilha(ws)
wb.save("relatorio_formatado.xlsx")

Graficos no Excel

O OpenPyXL suporta a criacao de graficos diretamente na planilha:

from openpyxl.chart import BarChart, Reference, PieChart

def adicionar_grafico_barras(ws):
    """Adiciona grafico de barras a planilha."""
    chart = BarChart()
    chart.type = "col"
    chart.title = "Vendas por Produto"
    chart.y_axis.title = "Valor Total (R$)"
    chart.x_axis.title = "Produto"

    dados = Reference(ws, min_col=4, min_row=1, max_row=ws.max_row)
    categorias = Reference(ws, min_col=1, min_row=2, max_row=ws.max_row)

    chart.add_data(dados, titles_from_data=True)
    chart.set_categories(categorias)
    chart.width = 20
    chart.height = 12

    ws_chart = ws.parent.create_sheet("Graficos")
    ws_chart.add_chart(chart, "A1")

def adicionar_grafico_pizza(ws):
    """Adiciona grafico de pizza."""
    chart = PieChart()
    chart.title = "Distribuicao de Vendas"

    dados = Reference(ws, min_col=4, min_row=1, max_row=ws.max_row)
    categorias = Reference(ws, min_col=1, min_row=2, max_row=ws.max_row)

    chart.add_data(dados, titles_from_data=True)
    chart.set_categories(categorias)
    chart.width = 18
    chart.height = 14

    ws_graficos = ws.parent["Graficos"]
    ws_graficos.add_chart(chart, "A20")

adicionar_grafico_barras(ws)
adicionar_grafico_pizza(ws)
wb.save("relatorio_com_graficos.xlsx")

Formulas e Funcoes do Excel

Voce pode inserir formulas do Excel nas celulas:

from openpyxl import Workbook

wb = Workbook()
ws = wb.active
ws.title = "Financeiro"

# Cabecalhos
ws.append(["Mes", "Receita", "Despesa", "Lucro"])

# Dados
meses = [
    ("Janeiro", 45000, 32000),
    ("Fevereiro", 52000, 35000),
    ("Marco", 48000, 33000),
    ("Abril", 55000, 36000),
    ("Maio", 61000, 38000),
    ("Junho", 58000, 37000),
]

for i, (mes, receita, despesa) in enumerate(meses, start=2):
    ws.append([mes, receita, despesa, f"=B{i}-C{i}"])

# Linha de totais
ultima_linha = ws.max_row + 1
ws.cell(row=ultima_linha, column=1, value="TOTAL")
ws.cell(row=ultima_linha, column=2, value=f"=SUM(B2:B{ultima_linha - 1})")
ws.cell(row=ultima_linha, column=3, value=f"=SUM(C2:C{ultima_linha - 1})")
ws.cell(row=ultima_linha, column=4, value=f"=SUM(D2:D{ultima_linha - 1})")

# Media
media_linha = ultima_linha + 1
ws.cell(row=media_linha, column=1, value="MEDIA")
ws.cell(row=media_linha, column=2, value=f"=AVERAGE(B2:B{ultima_linha - 1})")
ws.cell(row=media_linha, column=3, value=f"=AVERAGE(C2:C{ultima_linha - 1})")
ws.cell(row=media_linha, column=4, value=f"=AVERAGE(D2:D{ultima_linha - 1})")

wb.save("financeiro.xlsx")

Processamento em Lote

Para processar multiplas planilhas ou arquivos:

import os
from openpyxl import load_workbook, Workbook

def consolidar_planilhas(pasta: str, arquivo_saida: str):
    """Consolida dados de multiplas planilhas em uma so."""
    wb_saida = Workbook()
    ws_saida = wb_saida.active
    ws_saida.title = "Consolidado"

    primeira = True
    total_registros = 0

    for arquivo in sorted(os.listdir(pasta)):
        if not arquivo.endswith(".xlsx"):
            continue

        caminho = os.path.join(pasta, arquivo)
        wb = load_workbook(caminho)
        ws = wb.active

        for i, linha in enumerate(ws.iter_rows(values_only=True)):
            if i == 0 and primeira:
                ws_saida.append(list(linha))
                primeira = False
            elif i > 0:
                ws_saida.append(list(linha))
                total_registros += 1

        print(f"Processado: {arquivo}")

    wb_saida.save(arquivo_saida)
    print(f"\nTotal de registros consolidados: {total_registros}")

consolidar_planilhas("planilhas/", "consolidado.xlsx")

Formatacao Condicional

Destaque automaticamente celulas com base em seus valores:

from openpyxl.formatting.rule import CellIsRule
from openpyxl.styles import PatternFill

verde = PatternFill(start_color="C6EFCE", end_color="C6EFCE", fill_type="solid")
vermelho = PatternFill(start_color="FFC7CE", end_color="FFC7CE", fill_type="solid")

# Lucro positivo em verde
ws.conditional_formatting.add(
    "D2:D7",
    CellIsRule(operator="greaterThan", formula=["0"], fill=verde)
)

# Lucro negativo em vermelho
ws.conditional_formatting.add(
    "D2:D7",
    CellIsRule(operator="lessThan", formula=["0"], fill=vermelho)
)

Boas Praticas

Ao trabalhar com OpenPyXL, feche sempre os workbooks apos o uso para liberar memoria. Para planilhas muito grandes, use o modo write_only ou read_only para reduzir o consumo de RAM. Valide os dados antes de inseri-los nas celulas. E sempre faca backup dos arquivos originais antes de modifica-los com scripts.

Conclusao

O OpenPyXL transforma Python em uma ferramenta poderosa de automacao para Excel. Desde relatorios simples ate dashboards com graficos e formatacao condicional, tudo pode ser automatizado. Dominar essa biblioteca e um diferencial enorme para quem trabalha com dados, eliminando horas de trabalho manual e reduzindo erros em processos repetitivos.

E

Equipe Python Brasil

Contribuidor do Python Brasil — Aprenda Python em Português