Automação
10 min leitura
13 MAR 2026
Como automatizar planilhas Excel com Python
Crie, leia e manipule planilhas Excel sem abrir o Excel. Automatize relatórios com openpyxl.
Por que automatizar planilhas?
Se você já passou horas copiando dados entre planilhas, formatando células ou gerando o mesmo relatório toda semana, Python pode fazer isso em segundos.
pip install openpyxl
Criando uma planilha do zero
from openpyxl import Workbook
wb = Workbook()
ws = wb.active
ws.title = "Vendas"
# Cabecalho
ws.append(["Produto", "Quantidade", "Preco"])
# Dados
ws.append(["Camiseta", 50, 59.90])
ws.append(["Caneca", 120, 29.90])
ws.append(["Adesivo", 300, 5.00])
wb.save("vendas.xlsx")
print("Planilha criada!")
É isso. Cinco linhas e você tem um .xlsx pronto.
Lendo uma planilha existente
from openpyxl import load_workbook
wb = load_workbook("vendas.xlsx")
ws = wb.active
# Ler todas as linhas
for row in ws.iter_rows(min_row=2, values_only=True):
produto, quantidade, preco = row
total = quantidade * preco
print(f"{produto}: {quantidade} x R${preco:.2f} = R${total:.2f}")
O parâmetro min_row=2 pula o cabeçalho. values_only=True retorna os valores diretamente.
Acessando células específicas
from openpyxl import load_workbook
wb = load_workbook("vendas.xlsx")
ws = wb.active
# Por coordenada
print(ws["A1"].value) # Produto
print(ws["B2"].value) # 50
# Por linha e coluna
celula = ws.cell(row=2, column=3)
print(celula.value) # 59.90
# Alterando valor
ws["B2"] = 75
wb.save("vendas.xlsx")
Adicionando fórmulas
from openpyxl import Workbook
wb = Workbook()
ws = wb.active
ws.append(["Produto", "Qtd", "Preco", "Total"])
ws.append(["Camiseta", 50, 59.90, "=B2*C2"])
ws.append(["Caneca", 120, 29.90, "=B3*C3"])
ws.append(["Adesivo", 300, 5.00, "=B4*C4"])
# Soma geral
ws["D5"] = "=SUM(D2:D4)"
wb.save("vendas_formula.xlsx")
As fórmulas funcionam exatamente como no Excel.
Formatando células
from openpyxl import Workbook
from openpyxl.styles import Font, Alignment, PatternFill, Border, Side
wb = Workbook()
ws = wb.active
# Cabecalho estilizado
cabecalho = ["Produto", "Quantidade", "Preco"]
ws.append(cabecalho)
for cell in ws[1]:
cell.font = Font(bold=True, color="FFFFFF", size=12)
cell.fill = PatternFill(start_color="333333", fill_type="solid")
cell.alignment = Alignment(horizontal="center")
# Largura das colunas
ws.column_dimensions["A"].width = 20
ws.column_dimensions["B"].width = 15
ws.column_dimensions["C"].width = 15
# Dados
dados = [
["Camiseta", 50, 59.90],
["Caneca", 120, 29.90],
["Adesivo", 300, 5.00],
]
for linha in dados:
ws.append(linha)
# Formato de moeda na coluna C
for row in ws.iter_rows(min_row=2, min_col=3, max_col=3):
for cell in row:
cell.number_format = 'R$ #,##0.00'
wb.save("vendas_formatada.xlsx")
Trabalhando com múltiplas abas
from openpyxl import Workbook
wb = Workbook()
# Primeira aba (ja existe)
ws1 = wb.active
ws1.title = "Janeiro"
ws1.append(["Produto", "Vendas"])
ws1.append(["Camiseta", 150])
# Criar novas abas
ws2 = wb.create_sheet("Fevereiro")
ws2.append(["Produto", "Vendas"])
ws2.append(["Camiseta", 200])
ws3 = wb.create_sheet("Marco")
ws3.append(["Produto", "Vendas"])
ws3.append(["Camiseta", 180])
wb.save("vendas_trimestre.xlsx")
# Listar abas
print(wb.sheetnames) # ['Janeiro', 'Fevereiro', 'Marco']
Exemplo prático: relatório automático
Imagine que você recebe CSVs de vendas diárias e precisa consolidar tudo em uma planilha:
import csv
from pathlib import Path
from openpyxl import Workbook
from openpyxl.styles import Font, PatternFill
def gerar_relatorio(pasta_csvs, saida):
wb = Workbook()
ws = wb.active
ws.title = "Consolidado"
# Cabecalho
ws.append(["Arquivo", "Total Linhas", "Receita Total"])
for cell in ws[1]:
cell.font = Font(bold=True, color="FFFFFF")
cell.fill = PatternFill(start_color="2d2d2d", fill_type="solid")
# Processar cada CSV
for csv_file in sorted(Path(pasta_csvs).glob("*.csv")):
with open(csv_file, encoding="utf-8") as f:
reader = csv.DictReader(f)
linhas = list(reader)
total_linhas = len(linhas)
receita = sum(float(l.get("valor", 0)) for l in linhas)
ws.append([csv_file.stem, total_linhas, receita])
# Soma final
ultima = ws.max_row + 1
ws.cell(row=ultima, column=2, value=f"=SUM(B2:B{ultima-1})")
ws.cell(row=ultima, column=3, value=f"=SUM(C2:C{ultima-1})")
ws.cell(row=ultima, column=1, value="TOTAL").font = Font(bold=True)
# Formato moeda
for row in ws.iter_rows(min_row=2, min_col=3, max_col=3):
for cell in row:
cell.number_format = 'R$ #,##0.00'
wb.save(saida)
print(f"Relatorio salvo em {saida}")
gerar_relatorio("vendas_diarias", "relatorio_mensal.xlsx")
Resumo
| Função | Para que serve |
|---|---|
Workbook() |
Criar planilha nova |
load_workbook() |
Abrir planilha existente |
ws.append() |
Adicionar linha |
ws.cell(row, column) |
Acessar célula específica |
ws.iter_rows() |
Iterar pelas linhas |
Font, PatternFill |
Estilizar células |
wb.create_sheet() |
Criar nova aba |
Nunca mais perca tempo fazendo relatórios manualmente. Python + openpyxl = superpoder corporativo.