Manipulando Planilhas Excel com openpyxl em Python

Python e openpyxl

  1. Instalação

pip install openpyxl

  1. Trabalhando com arquivos

① Criar novo arquivo

from openpyxl import Workbook

# Instanciar workbook
planilha = Workbook()
# Ativar worksheet
aba = planilha.active

② Abrir arquivo existente

>>> from openpyxl import load_workbook
>>> planilha2 = load_workbook('nome_do_arquivo.xlsx')

  1. Armazenando dados

# Método 1: Dados podem ser atribuídos diretamente às células (pode inserir fórmulas)
aba['A1'] = 42
# Método 2: Pode adicionar linhas, começando pela primeira coluna (a partir do espaço em branco mais abaixo, mais à esquerda)
aba.append([1, 2, 3])
# Método 3: Tipos Python são convertidos automaticamente
aba['A3'] = datetime.datetime.now().strftime("%Y-%m-%d")

  1. Criar abas (sheet)

# Método 1: Inserir no final (padrão)
>>> aba1 = planilha.create_sheet("MinhaAba")
# Método 2: Inserir na posição inicial
>>> aba2 = planilha.create_sheet("MinhaAba", 0)

  1. Selecionar abas

# O nome da aba pode ser usado como chave para indexação
>>> aba3 = planilha["NovoTitulo"]
>>> aba4 = planilha.get_sheet_by_name("NovoTitulo")
>>> aba is aba3 is aba4
True

  1. Ver nomes das abas

# Exibir todos os nomes de abas
>>> print(planilha.sheetnames)
['Planilha2', 'NovoTitulo', 'Planilha1']
# Iterar sobre todas as abas
>>> for aba in planilha:
...     print(aba.title)

  1. Acessar células

① Acesso a uma única célula

# Método 1
>>> celula = aba['A4']
# Método 2: row = linha; column = coluna
>>> outra_celula = aba.cell(row=4, column=2, value=10)
# Método 3: Ao acessar, cria automaticamente
>>> for i in range(1,101):
...     for j in range(1,101):
...         aba.cell(row=i, column=j)

② Acesso a múltiplas células

# Através de slicing
>>> intervalo_celulas = aba['A1':'C2']
# Através de linhas (colunas)
>>> colC = aba['C']
>>> intervalo_colunas = aba['C:D']
>>> linha10 = aba[10]
>>> intervalo_linhas = aba[5:10]
# Através de intervalo especificado (linha → linha)
>>> for linha in aba.iter_rows(min_row=1, max_col=3, max_row=2):
...    for celula in linha:
...        print(celula)
<Célula Planilha1.A1>
<Célula Planilha1.B1>
<Célula Planilha1.C1>
<Célula Planilha1.A2>
<Célula Planilha1.B2>
<Célula Planilha1.C2>
# Através de intervalo especificado (coluna → coluna)
>>> for linha in aba.iter_cols(min_row=1, max_col=3, max_row=2):
...    for celula in linha:
...        print(celula)
<Célula Planilha1.A1>
<Célula Planilha1.B1>
<Célula Planilha1.C1>
<Célula Planilha1.A2>
<Célula Planilha1.B2>
<Célula Planilha1.C2>
# Iterar por todas as células - método 1
>>> aba = planilha.active
>>> aba['C9'] = 'olá mundo'
>>> tuple(aba.rows)
((<Célula Planilha.A1>, <Célula Planilha.B1>, <Célula Planilha.C1>),
(<Célula Planilha.A2>, <Célula Planilha.B2>, <Célula Planilha.C2>),
...
(<Célula Planilha.A8>, <Célula Planilha.B8>, <Célula Planilha.C8>),
(<Célula Planilha.A9>, <Célula Planilha.B9>, <Célula Planilha.C9>))
# Iterar por todas as células - método 2
>>> tuple(aba.columns)
((<Célula Planilha.A1>,
<Célula Planilha.A2>,
<Célula Planilha.A3>,
...
<Célula Planilha.B7>,
<Célula Planilha.B8>,
<Célula Planilha.B9>),
(<Célula Planilha.C1>,
...
<Célula Planilha.C8>,
<Célula Planilha.C9>))

  1. Salvar dados

>>> planilha.save('nome_do_arquivo.xlsx')

  1. Outras operações

① Alterar cor da aba

aba.sheet_properties.tabColor = "1072BA"

② Obter número máximo de linhas e colunas

# Obter máximo de colunas e linhas
print(aba.max_row)
print(aba.max_column)

③ Iterar por cada linha e cada coluna

  • aba.rows é um gerador que contém os dados de cada linha, cada linha é envolvida por uma tupla.
  • aba.columns é similar, porém cada tupla representa uma coluna de células.
# Como é por linha, retorna ordem A1, B1, C1
for linha in aba.rows:
    for celula in linha:
        print(celula.value)

# Ordem A1, A2, A3
for coluna in aba.columns:
    for celula in coluna:
        print(celula.value)

④ Covnerter números em letras e vice-versa

from openpyxl.utils import get_column_letter, column_index_from_string

# Retornar letra a partir do número da coluna
print(get_column_letter(2))  # B
# Retornar número da coluna a partir da letra
print(column_index_from_string('D'))  # 4

⑤ Remover planilha

# Método 1
planilha.remove(aba)
# Método 2
del planilha[aba]

⑥ Transposição de matriz (linhas → colunas)

dados = [
    ['Número', 'dado1', 'dado2'],
    [2, 40, 30],
    [3, 40, 25],
    [4, 50, 30],
    [5, 30, 10],
    [6, 25, 5],
    [7, 50, 10]]

list(zip(*dados))

# resultado
[('Número', 2, 3, 4, 5, 6, 7),
 ('dado1', 40, 40, 50, 30, 25, 50),
 ('dado2', 30, 25, 30, 10, 5, 10)]

# Atenção: o método descarta colunas (linhas) com dados ausentes
dados = [
    ['Número', 'dado1', 'dado2'],
    [2, 40      ],    # aqui falta um dado
    [3, 40, 25],
    [4, 50, 30],
    [5, 30, 10],
    [6, 25, 5],
    [7, 50, 10],
]
# resultado
[('Número', 2, 3, 4, 5, 6, 7), ('dado1', 40, 40, 50, 30, 25, 50)]

  1. Estilizando células

① Classes necessárias

from openpyxl.styles import Font, colors, Alignment

② Fonte

  • O código abaixo especifica Arial tamanho 24, negrito itálico, cor da fonte vermelho. Use diretamente o atributo font da célula, atribuindo um objeto Font.
fonte_negrito_itálico_24 = Font(name='Arial', size=24, italic=True, color=colors.RED, bold=True)

planilha['A1'].font = fonte_negrito_itálico_24

③ Alinhamento

  • Use diretamente o atributo alignment da célula, especificando alinhamento vertical e horizontal. Além de center, pode usar right, left, etc.
# Configurar dados em B1 com alinhamento vertical e horizontal centralizado
planilha['B1'].alignment = Alignment(horizontal='center', vertical='center')

④ Definir altura de linha e largura de coluna

# Altura da linha 2
planilha.row_dimensions[2].height = 40
# Largura da coluna C
planilha.column_dimensions['C'].width = 30

⑤ Mesclar e desmesclar células

  • Mesclar células significa usar a célula do canto superior esquerdo como referência, cobrindo as outras células para formar uma grande célula.
  • Após desmesclar, o valor retorna para a posição original do canto superior esquerdo.
# Mesclar células, basta escrever no canto superior esquerdo
planilha.merge_cells('B1:G1') # mesclar algumas células em uma linha
planilha.merge_cells('A1:C3') # mesclar uma região retangular de células

  • Após mesclar, só é possível escrever no canto superior esquerdo, ou seja, a coordenada mais à esquerda do intervalo.
  • Se houver dados em todas as células a serem mescladas, apenas os dados do canto superior esquerdo serão mantidos, os outros serão descartados.
  • Abaixo está o código para desmesclar. Após desmesclar, o valor volta para a posição A1
planilha.unmerge_cells('A1:C3')

Exemplo prático

import datetime
from random import choice
from time import time
from openpyxl import load_workbook
from openpyxl.utils import get_column_letter

# Definir nome do arquivo
nome_arquivo = "planilha_openpyxl.xlsx"
# Abrir arquivo
documento = load_workbook(nome_arquivo)
# Criar nova aba
nova_aba = documento.create_sheet()
# Primeira linha com cabeçalhos
nova_aba.append(['HORA', 'TÍTULO', 'A-Z'])

# Inserir conteúdo (500 linhas de dados)
for i in range(500):
    hora_atual = datetime.datetime.now().strftime("%H:%M:%S")
    titulo = str(time())
    letra_coluna = get_column_letter(choice(range(1, 50)))
    nova_aba.append([hora_atual, titulo, letra_coluna])

# Obter número máximo de linhas
total_linhas = nova_aba.max_row
# Obter número máximo de colunas
total_colunas = nova_aba.max_column
# Exibir conteúdo no console
for linha in nova_aba.rows:    # .rows obtém cada linha de dados
    for celula in linha:
        print(celula.value, end="\t")   # .value obtém o valor da célula
    print()
# Salvar, save (é obrigatório informar o nome do arquivo - caminho absoluto)
# O padrão é o diretório atual, apenas suporta formato xlsx)
documento.save(nome_arquivo)

Tags: Python openpyxl Excel Planilhas manipulacao-de-dados

Publicado em 7-1 20:20