Python e openpyxl
- Instalação
pip install openpyxl
- 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')
- 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")
- 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)
- 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
- 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)
- 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>))
- Salvar dados
>>> planilha.save('nome_do_arquivo.xlsx')
- 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)]
- 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)