Edição preservando formatação de XLS original (Excel COM)
Condições de disparo
- Usuário/cliente pede "alterar no arquivo original, manter formato/design idêntico, não mexer em outras tabelas"
- Ajuste das três demonstrações financeiras: alterar Lucros Acumulados/Lucro Total e manter Ativo = Passivo + Patrimônio Líquido
- Receber um .xls antigo para alterar números, sem poder recriar
Regra de ouro: não use openpyxl para recriar
Recriar com openpyxl perde formatação/estilos/layout originais — o cliente percebe que "não é a tabela original". Use o Excel COM para abrir uma cópia do arquivo original, alterar apenas as células alvo e manter o resto intacto.
Ambiente (Windows)
# pywin32 instalado no venv hermes (o python do sistema NÃO tem!)
python -m pip install pywin32
# Execute os scripts com o python do venv hermes (o python do sistema não importa win32com)
Fluxo principal
1. Copie o arquivo original antes de alterar
import shutil
shutil.copy2(SRC, OUT) # não mexe no original, altera OUT
2. Use COM para abrir + escanear para localizar linhas/colunas (não adivinhe números de linha!)
import win32com.client
excel = win32com.client.Dispatch('Excel.Application')
excel.Visible = False; excel.DisplayAlerts = False
wb = excel.Workbooks.Open(OUT)
ws = wb.Sheets('Balanço Patrimonial')
# Escaneie coluna A/E para encontrar o nome da conta, imprima a linha real e coluna
for r in range(1, 60):
a = str(ws.Cells(r, 1).Value or ''); e = str(ws.Cells(r, 5).Value or '')
if 'Lucros Acumulados' in a or 'Lucros Acumulados' in e:
print(r, a, e, ws.Cells(r,7).Value) # Coluna G/H são valores da direita
⚠️ Relatórios de duas colunas (balanço patrimonial): contas na coluna E, valores nas colunas G/H — "Lucros Acumulados" está em G34/H34 (direita), não em C/D! ⚠️ xlrd indexa a partir de 0 vs COM indexa a partir de 1 — diferença de 1 linha; confirme por label escaneando.
3. Altere apenas a célula alvo
ws.Cells(13, 3).Value = 4307698.97 # Outras contas a receber final (coluna esquerda C)
ws.Cells(34, 7).Value = 1052736.98 # Lucros Acumulados final (coluna direita G)
wb.Application.Calculate()
wb.Save(); wb.Close(True); excel.Quit()
4. ⚠️ XLS original geralmente não tem fórmulas — linhas de total devem ser calculadas manualmente e escritas
XLS exportados por sistemas de pequenas empresas geralmente têm totais como valores fixos, não fórmulas SUM — alterar detalhes não atualiza o total automaticamente. Após ajuste, calcule manualmente:
- Total do Ativo = Ativo Circulante + Ativo Não Circulante
- Total do Patrimônio Líquido = Capital Social + Lucros Acumulados
- Passivo + PL = Total do Passivo + Total do PL = Total do Ativo ✅ Verificar equilíbrio
- Demonstração de Resultados: Lucro Operacional = Receitas - Despesas - Administrativas - Financeiras; Lucro Total = Lucro Operacional + Receitas Não Operacionais; Lucro Líquido = Lucro Total - Imposto de Renda
5. Verificar equilíbrio
assert abs(ws.Cells(36,3).Value - ws.Cells(36,7).Value) < 0.01 # Ativo = Passivo + PL
Esquema comum de ajuste das três demonstrações financeiras (testado em 2026-08)
Objetivo: ajustar Lucros Acumulados (ex.: final 105K/inicial 79K), Lucro Total = diferença final - inicial.
- Balanço Patrimonial: ajustar apenas "Outras Contas a Receber" (lado do ativo) aumentar no mesmo valor → Ativo = Passivo + PL automaticamente equilibrado
- Demonstração de Resultados: ajustar "Receita Operacional" (ou Despesas Administrativas) para que Lucro Total = diferença de Lucros Acumulados; Lucro do período definido separadamente
- Demonstração de Fluxo de Caixa: ajustes de lucro sem recebimento/pagamento em dinheiro, geralmente não alterada
- Validação de equilíbrio:
Lucros Acumulados Final - Lucros Acumulados Inicial == Lucro Total Acumulado
Problemas e soluções
- pywin32 instalado apenas no venv hermes →
import win32comno python do sistema dá 'No module named pywintypes'; use python do venv - Modo isolado
python -Inão lê site-packages → execute sem -I - COM lê valor original como 0 → número da linha errado (xlrd indexa 0 vs COM indexa 1), localize por escaneamento de label
- Após alterar, validação mostra que não foi aplicado → verifique se alterou coluna esquerda ou direita (C/D vs G/H)
- Antes de matar processo python, confirme CommandLine (webapp/gateway também são processos python)
🙋 Sobre o autor
九品锦锂e (Jiǔpǐn Jǐnlǐ e) | Empacotando os buracos que pisei em skills "prontas para usar", não escrevo livros didáticos. Esta skill é a versão que uso todos os dias.
WeChat: ly5419495 (adicione com nota "SkillHub", dou prioridade) Conta pública: 初五Agent (pesquise no WeChat, lá estão as análises e métodos, pode ler sem adicionar WeChat)
Outras ferramentas que fiz e que funcionam diretamente, estão todas nesta prateleira (copie o link no navegador): https://skillpay.alipay.com/public/jiupinjinlie
Se travar ao usar, ou se tiver outros cenários que queira que eu empacote como skill, me encontre por qualquer um dos canais acima.
