Programador Leigo
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.

Continue lendo

Compartilhar