Descrição:
Este script realiza a conversão automática de um arquivo Excel no formato antigo .xls para o formato mais moderno .xlsx usando a automação do Excel via win32com. Após a conversão, ele carrega o arquivo convertido usando pandas, identifica dinamicamente a linha correta do cabeçalho (buscando a coluna "Código"), seleciona e limpa as colunas úteis, converte os saldos para valores numéricos, e tenta extrair uma referência textual presente nas primeiras linhas do arquivo original. Ao final, salva um novo arquivo Excel já tratado para uso posterior.
.xls..xlsx via automação do Excel..xlsx com pandas sem cabeçalho inicial._tratado.xlsx).python
CopyEdit
import os
import pandas as pd
import win32com.client as win32
# Solicita o caminho do arquivo .xls
arquivo_xls = input("Digite o caminho completo do arquivo .xls: ").strip('"')
# Define o nome do novo arquivo .xlsx
arquivo_xlsx = arquivo_xls.replace('.xls', '.xlsx')
# Passo 1 - Converter .xls em .xlsx
try:
print("⏳ Convertendo para .xlsx...")
excel = win32.gencache.EnsureDispatch('Excel.Application')
excel.DisplayAlerts = False
wb = excel.Workbooks.Open(arquivo_xls)
wb.SaveAs(arquivo_xlsx, FileFormat=51) # FileFormat=51 é .xlsx
wb.Close(False)
excel.Quit()
print(f"✅ Arquivo convertido: {arquivo_xlsx}")
except Exception as e:
print("❌ Erro na conversão:", e)
exit()
# Passo 2 - Carregar Excel com pandas
try:
print("📥 Lendo dados...")
df_raw = pd.read_excel(arquivo_xlsx, header=None)
except Exception as e:
print("❌ Erro ao ler arquivo .xlsx:", e)
exit()
# Passo 3 - Procurar cabeçalho real e tratar os dados
try:
print("🔍 Procurando cabeçalho real...")
for i, row in df_raw.iterrows():
if str(row[0]).strip() == 'Código':
df = df_raw.iloc[i+1:].copy()
df.columns = df_raw.iloc[i]
break
else:
print("❌ Cabeçalho 'Código' não encontrado.")
exit()
# Mantém só colunas úteis
colunas_necessarias = ['Código', 'Classificação', 'Descrição da conta', 'Saldo Anterior', 'Saldo Atual']
df = df[colunas_necessarias]
# Limpeza dos dados
df = df[df['Código'].notna()]
df['Saldo Anterior'] = pd.to_numeric(df['Saldo Anterior'], errors='coerce').fillna(0)
df['Saldo Atual'] = pd.to_numeric(df['Saldo Atual'], errors='coerce').fillna(0)
df['Descrição da conta'] = df['Descrição da conta'].astype(str).str.strip()
# Extrai possível referência nas primeiras linhas
referencia = None
for i in range(5):
for val in df_raw.iloc[i]:
if isinstance(val, str) and 'referente' in val.lower():
referencia = val
break
if referencia:
break
df['Referência'] = referencia if referencia else 'Indefinido'
# Passo 4 - Salvar o dataframe tratado
caminho_tratado = arquivo_xlsx.replace('.xlsx', '_tratado.xlsx')
df.to_excel(caminho_tratado, index=False)
print(f"✅ Dados tratados e salvos em: {caminho_tratado}")
# Exibe o dataframe tratado no console
print(df)
except Exception as e:
print("❌ Erro no tratamento:", e)
exit()