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.


Passos principais:

  1. Solicita o caminho do arquivo .xls.
  2. Converte o arquivo para .xlsx via automação do Excel.
  3. Lê o arquivo .xlsx com pandas sem cabeçalho inicial.
  4. Procura a linha onde está o cabeçalho (coluna "Código").
  5. Seleciona as colunas essenciais, trata os dados (remoção de nulos, conversão de tipos).
  6. Extrai uma possível informação de "referência" textual nas primeiras linhas.
  7. Salva um arquivo Excel tratado (_tratado.xlsx).

Código completo:

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()