Se você já teve problemas ao trabalhar com planilhas complexas no Excel usando o pandas (pd.read_excel), este artigo irá ensinar como extrair tabelas separadamente usando Python e a biblioteca openpyxl.
O Limite do pd.read_excel
Vamos começar entendendo o problema. Se temos uma planilha do Excel com várias tabelas e usamos pd.read_excel, obtemos um grande conjunto de dados com todas as tabelas. Mas como podemos extrair cada tabela separadamente?
A Ideia – Extrair Tabelas Individualmente
Cada tabela em uma planilha tem algumas características comuns:
- Uma célula no canto superior esquerdo.
- Um número fixo de colunas.
- Um número fixo de linhas.
Podemos escrever código para extrair cada uma dessas tabelas, fornecendo as informações necessárias para cada uma delas.
Usando openpyxl para Ler um Arquivo do Excel
Primeiro, certifique-se de instalar a biblioteca openpyxl em seu ambiente Python. Você pode fazer isso executando o seguinte comando em seu terminal ou prompt de comando:
pip install openpyxl
Em seguida, vamos usar o openpyxl para abrir o arquivo Excel:
from openpyxl import load_workbook
# Carregue o caminho para o arquivo Excel
workbook = load_workbook('Book1.xlsx')
# Selecione a planilha do Excel que você deseja ler
sheet1 = workbook['Sheet1']
Agora que carregamos a planilha do Excel, podemos começar a extrair as tabelas individualmente.
Código para Extrair Tabelas Individuais
Aqui está o código para extrair tabelas individuais:
from string import ascii_uppercase
from itertools import pairwise
from openpyxl import load_workbook
import pandas as pd
def get_next_code(code):
'''
Retorna a próxima letra da coluna com base na letra atual
Entrada: 'AA', Saída: 'AB'
Entrada: 'AB', Saída: 'AC'
'''
letter_map = {a: b for a, b in pairwise(ascii_uppercase)}
code = list(code)
i = -1
while True:
if code[i] == 'Z':
code[i] = 'A'
i -= 1
if abs(i) > len(code):
return 'A' + ''.join(code)
else:
code[i] = letter_map[code[i]]
return ''.join(code)
def snap_table(sheet, topleft, num_columns, num_rows):
'''
Entrada:
sheet: a planilha do Excel que queremos extrair
topleft: coordenadas do canto superior esquerdo, por exemplo, 'B2'
num_columns: número de colunas na tabela
num_rows: número de linhas na tabela
Saída:
dataframe pandas representando a tabela
'''
try:
import re
col = re.findall('[a-zA-Z]+', topleft)[0]
num = int(re.findall('[0-9]+', topleft)[0])
columns = [col]
for i in range(num_columns - 1):
columns.append(get_next_code(columns[-1]))
numbers = [n for n in range(num, num + num_rows)]
data = []
for n in numbers:
row = []
for c in columns:
code = c + str(n)
row.append(sheet[code].value)
data.append(row)
return pd.DataFrame(data[1:], columns=data[0])
except Exception as e:
return pd.DataFrame()
O código acima define uma função chamada snap_table, que recebe os seguintes parâmetros:
- sheet: a planilha do Excel da qual queremos extrair a tabela.
- topleft: as coordenadas do canto superior esquerdo da tabela, por exemplo, ‘B2’.
- num_columns: o número de colunas na tabela.
- num_rows: o número de linhas na tabela.
A função snap_table extrai a tabela com base nessas informações e a retorna como um dataframe do pandas.
Como Usar o Código
Agora que temos nossa função snap_table, podemos usá-la para extrair tabelas individuais de nossa planilha. Por exemplo:
# Carregue o caminho para o arquivo Excel e selecione a planilha
workbook = load_workbook('Book1.xlsx')
sheet1 = workbook['Sheet1']
# Extrair e imprimir uma tabela
print(snap_table(sheet1, 'B2', 2, 4))
Você pode chamar a função snap_table com as coordenadas do canto superior esquerdo e as dimensões da tabela que deseja extrair.
Conclusão
Espero que este artigo tenha sido útil para você, permitindo extrair tabelas individuais de uma planilha complexa do Excel. Agora você pode lidar com planilhas contendo várias tabelas de forma mais eficiente usando Python e a biblioteca openpyxl.
Mais Referências
Link para a biblioteca Openpyxl: https://openpyxl.readthedocs.io/en/stable/