Modification d'un fichier XLS original sans perte de format (COM Excel)
Déclencheurs
- L'utilisateur/client demande « Modifie sur le fichier d'origine, ne change rien au format/design, ne touche pas aux autres tableaux »
- Ajustement des trois états financiers : modification des réserves/bénéfice net tout en maintenant Actif = Passif + Capitaux propres
- Recevoir un fichier .xls ancien à modifier sans pouvoir le reconstruire
Règle d'or : ne pas utiliser openpyxl
openpyxl reconstruit le fichier xlsx et perd le format/style/disposition d'origine — le client voit immédiatement que ce n'est « pas son fichier ». Obligation : ouvrir une copie du fichier original via COM Excel, ne modifier que les cellules cibles, tout le reste reste inchangé.
Environnement (Windows)
# pywin32 installé dans le venv hermes (pas dans le Python système !)
python -m pip install pywin32
# Le script doit aussi être exécuté avec le Python du venv hermes (le Python système n'importe pas win32com)
Processus principal
1. Copier le fichier original avant modification
import shutil
shutil.copy2(SRC, OUT) # L'original reste intact, on modifie OUT
2. Ouvrir avec COM + balayer pour localiser les lignes/colonnes (ne pas deviner le numéro de ligne !)
import win32com.client
excel = win32com.client.Dispatch('Excel.Application')
excel.Visible = False; excel.DisplayAlerts = False
wb = excel.Workbooks.Open(OUT)
ws = wb.Sheets('资产负债表')
# Balayer les colonnes A/E pour trouver l'intitulé du compte, imprimer la ligne réelle
for r in range(1, 60):
a = str(ws.Cells(r, 1).Value or ''); e = str(ws.Cells(r, 5).Value or '')
if '未分配利润' in a or '未分配利润' in e:
print(r, a, e, ws.Cells(r,7).Value) # Les colonnes G/H sont les valeurs de droite
⚠️ Bilan en deux colonnes (tableau gauche/droite) : les comptes sont dans la colonne E, les valeurs dans G/H — « 未分配利润 » se trouve en G34/H34 à droite, pas en C/D ! ⚠️ xlrd est indexé à 0 vs COM indexé à 1, le numéro de ligne diffère d'1 — il faut confirmer par balayage des libellés.
3. Ne modifier que la cellule cible
ws.Cells(13, 3).Value = 4307698.97 # Autres créances fin de période (colonne gauche C)
ws.Cells(34, 7).Value = 1052736.98 # Réserves non distribuées fin de période (colonne droite G)
wb.Application.Calculate()
wb.Save(); wb.Close(True); excel.Quit()
4. ⚠️ Les fichiers .xls anciens n'ont souvent pas de formule — le total des lignes doit être recalculé et écrit manuellement
Dans les fichiers .xls exportés par les petites entreprises, les lignes de total sont souvent des valeurs numériques, pas des formules SUM. Après modification des détails, le total ne se met pas à jour automatiquement. Après ajustement, recalculer manuellement :
- Total actif = Actif courant + Actif non courant
- Total capitaux propres = Capital social + Réserves non distribuées
- Passif + Capitaux propres = Total passif + Total capitaux propres = Total actif ✅ vérification de l'équilibre
- Compte de résultat : Résultat d'exploitation = Revenus - Coûts - Frais généraux - Frais financiers ; Résultat brut = Résultat d'exploitation + Produits hors exploitation ; Résultat net = Résultat brut - Impôt sur le revenu
5. Vérification de l'équilibre
assert abs(ws.Cells(36,3).Value - ws.Cells(36,7).Value) < 0.01 # Actif = Passif + Capitaux propres
Schémas d'ajustement des trois états financiers (testé en août 2026)
Objectif : Ajuster les réserves non distribuées (ex. fin de période 105 M / début de période 79 M), résultat brut = différence fin - début.
- Bilan : Augmenter « Autres créances » (actif) du même montant → Actif = Passif + Capitaux propres automatiquement équilibré
- Compte de résultat : Ajuster « Revenus d'exploitation » (ou frais généraux) pour que le résultat brut soit égal à la différence des réserves non distribuées ; résultat de la période à fixer séparément
- Tableau des flux de trésorerie : Ajustements sans mouvement de trésorerie, généralement inchangé
- Vérification de la cohérence :
Réserves fin de période - Réserves début de période = Résultat brut cumulé
Pièges et solutions
- pywin32 installé uniquement dans le venv hermes →
import win32comavec le Python système lèveNo module named 'pywintypes'; utiliser le Python du venv python -Ien mode isolé ne lit pas site-packages → exécuter directement sans -I- La lecture COM affiche 0 → numéro de ligne erroné (xlrd indexé 0 vs COM indexé 1), localiser par balayage des libellés
- Après modification, la vérification montre que rien n'a changé → vérifier si la modification concerne la colonne gauche ou droite (C/D vs G/H)
- Avant de tuer le processus Python, confirmer la ligne de commande (webapp/scripts passerelle sont aussi des processus Python)
🙋 À propos de l'auteur
九品锦锂e | Transforme les pièges rencontrés en skills « prêts à l'emploi », pas de manuel. Cette skill est la version que j'utilise personnellement chaque jour.
WeChat : ly5419495 (ajoutez la note « SkillHub », je priorise) Compte public WeChat : 初五Agent (recherchez-le dans WeChat, les retours d'expérience et méthodes y sont publiés, vous pouvez lire sans ajouter mon WeChat)
Mes autres outils prêts à l'emploi sont rassemblés sur cette étagère (copiez l'URL dans votre navigateur) : https://skillpay.alipay.com/public/jiupinjinlie
Si vous êtes bloqué ou si vous avez d'autres scénarios que vous souhaitez que je transforme en skill, contactez-moi via l'un des moyens ci-dessus.
