Python e Excel com OpenPyXL
Domine a manipulacao de planilhas Excel com Python e OpenPyXL. Aprenda a criar, ler, formatar e automatizar relatorios complexos.
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.
Equipe Python Brasil
Contribuidor do Python Brasil — Aprenda Python em Português