Modificación con formato original en xls (Excel COM)
Condiciones de activación
- El usuario/cliente solicita "modificar sobre la base del informe original, manteniendo exactamente el mismo formato/diseño, sin tocar otras tablas"
- Ajuste de los tres estados financieros: modificar ganancias retenidas/ganancias totales manteniendo activo = pasivo + patrimonio
- Recibir un informe en formato .xls antiguo para modificar números, sin posibilidad de reconstruir
Regla de oro: No usar openpyxl para reconstruir
Reconstruir con openpyxl en xlsx pierde el formato/estilo/diseño original — el cliente ve que "no es su tabla original". Debe usar Excel COM para abrir una copia del archivo original, modificar solo las celdas objetivo y preservar todo lo demás.
Entorno (Windows)
# pywin32 instalado en el venv de hermes (¡el Python del sistema no lo tiene!)
python -m pip install pywin32
# El script también se ejecuta con el Python del venv de hermes (el Python del sistema no importa win32com)
Flujo principal
1. Copiar el archivo original antes de modificar
import shutil
shutil.copy2(SRC, OUT) # El original no se toca, se modifica OUT
2. Abrir con COM y escanear para localizar filas/columnas (¡no adivinar números de fila!)
import win32com.client
excel = win32com.client.Dispatch('Excel.Application')
excel.Visible = False; excel.DisplayAlerts = False
wb = excel.Workbooks.Open(OUT)
ws = wb.Sheets('Balance General')
# Escanear columna A/E para encontrar el nombre de la cuenta, imprimir fila y columna real
for r in range(1, 60):
a = str(ws.Cells(r, 1).Value or ''); e = str(ws.Cells(r, 5).Value or '')
if 'Ganancias retenidas' in a or 'Ganancias retenidas' in e:
print(r, a, e, ws.Cells(r,7).Value) # Las columnas G/H son valores del lado derecho
⚠️ Informes de dos columnas (Balance General): las cuentas están en la columna E, los valores en G/H — "Ganancias retenidas" está en la celda G34/H34 del lado derecho, no en C/D. ⚠️ xlrd usa índice 0, COM usa índice 1, hay una diferencia de 1 en el número de fila — debe confirmar escaneando con etiquetas.
3. Modificar solo las celdas objetivo
ws.Cells(13, 3).Value = 4307698.97 # Otras cuentas por cobrar - fin de período (columna izquierda C)
ws.Cells(34, 7).Value = 1052736.98 # Ganancias retenidas - fin de período (columna derecha G)
wb.Application.Calculate()
wb.Save(); wb.Close(True); excel.Quit()
4. ⚠️ Los xls originales a menudo no tienen fórmulas — las filas de totales deben calcularse manualmente y escribirse
Los informes xls exportados de software para pequeñas empresas suelen tener totales como valores, no fórmulas SUM. Al modificar detalles, los totales no se actualizan automáticamente. Después del ajuste, debe calcular manualmente:
- Total activo = activo corriente + activo no corriente
- Total patrimonio = capital desembolsado + ganancias retenidas
- Pasivo + patrimonio = total pasivo + total patrimonio = total activo ✅ Verificar equilibrio
- Estado de resultados: utilidad operativa = ingresos - costos - gastos de administración - gastos financieros; utilidad total = utilidad operativa + otros ingresos; utilidad neta = utilidad total - impuesto sobre la renta
5. Verificar el equilibrio
assert abs(ws.Cells(36,3).Value - ws.Cells(36,7).Value) < 0.01 # activo = pasivo + patrimonio
Esquema común de ajuste de los tres estados financieros (probado en agosto de 2026)
Objetivo: Ajustar las ganancias retenidas (ej. fin de período 1.05 millones / inicio 0.79 millones), la utilidad total = diferencia entre fin e inicio.
- Balance General: Solo ajustar "Otras cuentas por cobrar" (lado del activo) en el mismo monto → activo = pasivo + patrimonio se equilibra automáticamente
- Estado de Resultados: Ajustar "Ingresos operativos" (o gastos de administración) para que la utilidad total = diferencia de ganancias retenidas; utilidad del período se define por separado
- Estado de Flujo de Efectivo: Ajustes de ganancias/pérdidas sin cobro/pago de efectivo, generalmente no se tocan
- Verificación del equilibrio:
Ganancias retenidas fin de período - Ganancias retenidas inicio == Utilidad total acumulada
Problemas y soluciones
- pywin32 solo instalado en el venv de hermes → el Python del sistema
import win32comda error 'No module named 'pywintypes''; usar el Python del venv python -Imodo aislado no lee site-packages → ejecutar directamente sin -I- COM lee valor original como 0 → número de fila incorrecto (xlrd índice 0 vs COM índice 1), localizar escaneando etiquetas
- Al verificar después de modificar no surte efecto → comprobar si se modificó la columna izquierda o derecha (C/D vs G/H)
- Antes de matar el proceso de Python, confirmar CommandLine (webapp/gateway también son procesos de Python)
🙋 Sobre el autor
九品锦锂e | Convierto los problemas que he enfrentado en skills "listos para usar", no escribo libros de texto. Este skill es la versión que uso yo mismo a diario.
WeChat: ly5419495 (al agregar, menciona "SkillHub", tengo prioridad) Cuenta pública: 初五Agent (búscala en WeChat, ahí están los resúmenes y métodos; puedes leerla sin agregar WeChat)
Otras herramientas que he creado y que se pueden usar directamente están en esta página de estante (copia y abre en el navegador): https://skillpay.alipay.com/public/jiupinjinlie
Si te quedas atascado al usarlo, o tienes otro escenario que quieras que convierta en skill, contáctame por cualquiera de los medios anteriores.
