Compétence Excel pour OpenClawd
TL;DR
- Génère/édite des fichiers Excel avec des formules (pas des valeurs hardcodées).
- Optionnel: recalcul via LibreOffice headless + détection d’erreurs Excel.
- Livrable attendu: un fichier tableur propre (XLSX/XLSM/CSV/TSV).
Prérequis
Dépendances Python
pip install openpyxl pandas xlrd xlwt
LibreOffice (pour recalcul des formules)
# Ubuntu/Debian
sudo apt-get install libreoffice-calc libreoffice-common
Règles de Qualité
Police Professionnelle
- Utiliser une police cohérente (Arial, Times New Roman) sauf instruction contraire
Zéro Erreur de Formule
- Tout fichier Excel DOIT être livré SANS erreurs (#REF!, #DIV/0!, #VALUE!, #N/A, #NAME?)
Préservation des Templates
- Respecter EXACTEMENT le format et style existants lors de modifications
- Les conventions du template préexistant ont TOUJOURS priorité
Standards pour Modèles Financiers
Code Couleur (Standards Industrie)
- Texte bleu (RGB: 0,0,255) : Inputs hardcodés, valeurs modifiables
- Texte noir (RGB: 0,0,0) : TOUTES les formules et calculs
- Texte vert (RGB: 0,128,0) : Liens vers autres feuilles du même classeur
- Texte rouge (RGB: 255,0,0) : Liens externes vers autres fichiers
- Fond jaune (RGB: 255,255,0) : Hypothèses clés ou cellules à mettre à jour
Formatage des Nombres
- Années : Format texte ("2024" pas "2,024")
- Devises : Format $#,##0 ; spécifier unités dans les en-têtes ("Revenue ($mm)")
- Zéros : Afficher comme "-" (format: "$#,##0;($#,##0);-")
- Pourcentages : Format 0.0% par défaut
- Multiples : Format 0.0x (EV/EBITDA, P/E)
- Négatifs : Parenthèses (123) pas moins -123
CRITIQUE : Utiliser des Formules, PAS des Valeurs Hardcodées
TOUJOURS utiliser des formules Excel au lieu de calculer en Python et hardcoder.
❌ MAUVAIS - Hardcoding
# Mauvais: Calcul Python puis hardcode
total = df['Sales'].sum()
sheet['B10'] = total # Hardcode 5000
# Mauvais: Taux de croissance calculé en Python
growth = (df.iloc[-1]['Revenue'] - df.iloc[0]['Revenue']) / df.iloc[0]['Revenue']
sheet['C5'] = growth # Hardcode 0.15
✅ CORRECT - Formules Excel
# Bon: Laisser Excel calculer
sheet['B10'] = '=SUM(B2:B9)'
# Bon: Taux de croissance en formule Excel
sheet['C5'] = '=(C4-C2)/C2'
# Bon: Moyenne en fonction Excel
sheet['D20'] = '=AVERAGE(D2:D19)'
Workflows
Workflow Standard
- Choisir l'outil : pandas pour données, openpyxl pour formules/formatage
- Créer/Charger : Nouveau classeur ou fichier existant
- Modifier : Données, formules, formatage
- Sauvegarder : Écrire le fichier
- Recalculer (OBLIGATOIRE si formules) :
python scripts/recalc.py output.xlsx
- Vérifier et corriger les erreurs détectées
Lecture et Analyse avec pandas
import pandas as pd
# Lire Excel
df = pd.read_excel('file.xlsx') # Première feuille par défaut
all_sheets = pd.read_excel('file.xlsx', sheet_name=None) # Dict de toutes les feuilles
# Analyser
df.head() # Aperçu
df.info() # Info colonnes
df.describe() # Statistiques
# Écrire
df.to_excel('output.xlsx', index=False)
Création de Fichiers Excel
from openpyxl import Workbook
from openpyxl.styles import Font, PatternFill, Alignment
wb = Workbook()
sheet = wb.active
# Données
sheet['A1'] = 'Hello'
sheet['B1'] = 'World'
sheet.append(['Row', 'of', 'data'])
# Formule
sheet['B2'] = '=SUM(A1:A10)'
# Formatage
sheet['A1'].font = Font(bold=True, color='FF0000')
sheet['A1'].fill = PatternFill('solid', start_color='FFFF00')
sheet['A1'].alignment = Alignment(horizontal='center')
# Largeur colonne
sheet.column_dimensions['A'].width = 20
wb.save('output.xlsx')
Édition de Fichiers Existants
from openpyxl import load_workbook
# Charger fichier existant
wb = load_workbook('existing.xlsx')
sheet = wb.active # ou wb['NomFeuille']
# Parcourir les feuilles
for sheet_name in wb.sheetnames:
sheet = wb[sheet_name]
print(f"Feuille: {sheet_name}")
# Modifier
sheet['A1'] = 'Nouvelle Valeur'
sheet.insert_rows(2) # Insérer ligne
sheet.delete_cols(3) # Supprimer colonne
# Ajouter feuille
new_sheet = wb.create_sheet('NouvelleFeuille')
new_sheet['A1'] = 'Data'
wb.save('modified.xlsx')
Recalcul des Formules
Les fichiers créés par openpyxl contiennent les formules comme chaînes mais pas les valeurs calculées. Utiliser le script recalc.py :
python scripts/recalc.py <fichier_excel> [timeout_secondes]
Le script :
- Configure automatiquement la macro LibreOffice au premier lancement
- Recalcule toutes les formules
- Scanne TOUTES les cellules pour erreurs Excel
- Retourne JSON avec détails et emplacements des erreurs
Interprétation de la Sortie
{
"status": "success", // ou "errors_found"
"total_errors": 0, // Nombre total d'erreurs
"total_formulas": 42, // Nombre de formules
"error_summary": { // Présent si erreurs
"#REF!": {
"count": 2,
"locations": ["Sheet1!B5", "Sheet1!C10"]
}
}
}
Checklist de Vérification
Vérifications Essentielles
Pièges Courants
Bonnes Pratiques
Sélection de Bibliothèque
- pandas : Analyse de données, opérations en masse, export simple
- openpyxl : Formatage complexe, formules, fonctionnalités Excel spécifiques
Avec openpyxl
- Indices de cellules en base 1 (row=1, column=1 = cellule A1)
data_only=True pour lire valeurs calculées
- Attention : Sauvegarder après
data_only=True remplace définitivement les formules par les valeurs
- Pour gros fichiers :
read_only=True ou write_only=True
Avec pandas
- Spécifier types de données :
pd.read_excel('file.xlsx', dtype={'id': str})
- Pour gros fichiers, colonnes spécifiques :
usecols=['A', 'C', 'E']
- Gestion des dates :
parse_dates=['date_column']
Style de Code
IMPORTANT : Code Python minimal et concis, sans commentaires superflus.
Pour les fichiers Excel :
- Commenter les cellules avec formules complexes
- Documenter les sources des données hardcodées
- Inclure notes pour calculs clés
1---2name: xlsx-pro3description: Compétence pour manipuler les fichiers Excel (.xlsx, .xlsm, .csv, .tsv). Utiliser quand l'utilisateur veut : ouvrir, lire, éditer ou créer un fichier tableur ; ajouter des colonnes, calculer des formules, formater, créer des graphiques, nettoyer des données ; convertir entre formats tabulaires. Le livrable doit être un fichier tableur. NE PAS utiliser si le livrable est un document Word, HTML, script Python standalone, ou intégration Google Sheets.4---5
6# Compétence Excel pour OpenClawd
7
8## TL;DR
9- Génère/édite des fichiers Excel avec des **formules** (pas des valeurs hardcodées).
10- Optionnel: **recalcul** via LibreOffice headless + détection d’erreurs Excel.
11- Livrable attendu: un fichier tableur propre (XLSX/XLSM/CSV/TSV).
12
13
14## Prérequis
15
16### Dépendances Python
17```bash
18pip install openpyxl pandas xlrd xlwt
19```
20
21### LibreOffice (pour recalcul des formules)
22```bash
23# Ubuntu/Debian
24sudo apt-get install libreoffice-calc libreoffice-common
25```
26
27## Règles de Qualité
28
29### Police Professionnelle
30- Utiliser une police cohérente (Arial, Times New Roman) sauf instruction contraire
31
32### Zéro Erreur de Formule
33- Tout fichier Excel DOIT être livré SANS erreurs (#REF!, #DIV/0!, #VALUE!, #N/A, #NAME?)
34
35### Préservation des Templates
36- Respecter EXACTEMENT le format et style existants lors de modifications
37- Les conventions du template préexistant ont TOUJOURS priorité
38
39## Standards pour Modèles Financiers
40
41### Code Couleur (Standards Industrie)
42- **Texte bleu (RGB: 0,0,255)** : Inputs hardcodés, valeurs modifiables
43- **Texte noir (RGB: 0,0,0)** : TOUTES les formules et calculs
44- **Texte vert (RGB: 0,128,0)** : Liens vers autres feuilles du même classeur
45- **Texte rouge (RGB: 255,0,0)** : Liens externes vers autres fichiers
46- **Fond jaune (RGB: 255,255,0)** : Hypothèses clés ou cellules à mettre à jour
47
48### Formatage des Nombres
49- **Années** : Format texte ("2024" pas "2,024")
50- **Devises** : Format $#,##0 ; spécifier unités dans les en-têtes ("Revenue ($mm)")
51- **Zéros** : Afficher comme "-" (format: "$#,##0;($#,##0);-")
52- **Pourcentages** : Format 0.0% par défaut
53- **Multiples** : Format 0.0x (EV/EBITDA, P/E)
54- **Négatifs** : Parenthèses (123) pas moins -123
55
56## CRITIQUE : Utiliser des Formules, PAS des Valeurs Hardcodées
57
58**TOUJOURS utiliser des formules Excel au lieu de calculer en Python et hardcoder.**
59
60### ❌ MAUVAIS - Hardcoding
61```python
62# Mauvais: Calcul Python puis hardcode
63total = df['Sales'].sum()
64sheet['B10'] = total # Hardcode 5000
65
66# Mauvais: Taux de croissance calculé en Python
67growth = (df.iloc[-1]['Revenue'] - df.iloc[0]['Revenue']) / df.iloc[0]['Revenue']
68sheet['C5'] = growth # Hardcode 0.15
69```
70
71### ✅ CORRECT - Formules Excel
72```python
73# Bon: Laisser Excel calculer
74sheet['B10'] = '=SUM(B2:B9)'
75
76# Bon: Taux de croissance en formule Excel
77sheet['C5'] = '=(C4-C2)/C2'
78
79# Bon: Moyenne en fonction Excel
80sheet['D20'] = '=AVERAGE(D2:D19)'
81```
82
83## Workflows
84
85### Workflow Standard
861. **Choisir l'outil** : pandas pour données, openpyxl pour formules/formatage
872. **Créer/Charger** : Nouveau classeur ou fichier existant
883. **Modifier** : Données, formules, formatage
894. **Sauvegarder** : Écrire le fichier
905. **Recalculer (OBLIGATOIRE si formules)** : `python scripts/recalc.py output.xlsx`
916. **Vérifier et corriger** les erreurs détectées
92
93### Lecture et Analyse avec pandas
94```python
95import pandas as pd
96
97# Lire Excel
98df = pd.read_excel('file.xlsx') # Première feuille par défaut
99all_sheets = pd.read_excel('file.xlsx', sheet_name=None) # Dict de toutes les feuilles
100
101# Analyser
102df.head() # Aperçu
103df.info() # Info colonnes
104df.describe() # Statistiques
105
106# Écrire
107df.to_excel('output.xlsx', index=False)
108```
109
110### Création de Fichiers Excel
111```python
112from openpyxl import Workbook
113from openpyxl.styles import Font, PatternFill, Alignment
114
115wb = Workbook()
116sheet = wb.active
117
118# Données
119sheet['A1'] = 'Hello'
120sheet['B1'] = 'World'
121sheet.append(['Row', 'of', 'data'])
122
123# Formule
124sheet['B2'] = '=SUM(A1:A10)'
125
126# Formatage
127sheet['A1'].font = Font(bold=True, color='FF0000')
128sheet['A1'].fill = PatternFill('solid', start_color='FFFF00')
129sheet['A1'].alignment = Alignment(horizontal='center')
130
131# Largeur colonne
132sheet.column_dimensions['A'].width = 20
133
134wb.save('output.xlsx')
135```
136
137### Édition de Fichiers Existants
138```python
139from openpyxl import load_workbook
140
141# Charger fichier existant
142wb = load_workbook('existing.xlsx')
143sheet = wb.active # ou wb['NomFeuille']
144
145# Parcourir les feuilles
146for sheet_name in wb.sheetnames:
147 sheet = wb[sheet_name]
148 print(f"Feuille: {sheet_name}")
149
150# Modifier
151sheet['A1'] = 'Nouvelle Valeur'
152sheet.insert_rows(2) # Insérer ligne
153sheet.delete_cols(3) # Supprimer colonne
154
155# Ajouter feuille
156new_sheet = wb.create_sheet('NouvelleFeuille')
157new_sheet['A1'] = 'Data'
158
159wb.save('modified.xlsx')
160```
161
162## Recalcul des Formules
163
164Les fichiers créés par openpyxl contiennent les formules comme chaînes mais pas les valeurs calculées. Utiliser le script `recalc.py` :
165
166```bash
167python scripts/recalc.py <fichier_excel> [timeout_secondes]
168```
169
170Le script :
171- Configure automatiquement la macro LibreOffice au premier lancement
172- Recalcule toutes les formules
173- Scanne TOUTES les cellules pour erreurs Excel
174- Retourne JSON avec détails et emplacements des erreurs
175
176### Interprétation de la Sortie
177```json
178{
179 "status": "success", // ou "errors_found"
180 "total_errors": 0, // Nombre total d'erreurs
181 "total_formulas": 42, // Nombre de formules
182 "error_summary": { // Présent si erreurs
183 "#REF!": {
184 "count": 2,
185 "locations": ["Sheet1!B5", "Sheet1!C10"]
186 }
187 }
188}
189```
190
191## Checklist de Vérification
192
193### Vérifications Essentielles
194- [ ] **Tester 2-3 références** : Vérifier qu'elles tirent les bonnes valeurs
195- [ ] **Mapping colonnes** : Confirmer correspondance (colonne 64 = BL, pas BK)
196- [ ] **Offset lignes** : Excel est 1-indexé (DataFrame row 5 = Excel row 6)
197
198### Pièges Courants
199- [ ] **Gestion NaN** : Vérifier valeurs nulles avec `pd.notna()`
200- [ ] **Colonnes éloignées** : Données FY souvent en colonnes 50+
201- [ ] **Correspondances multiples** : Chercher toutes les occurrences
202- [ ] **Division par zéro** : Vérifier dénominateurs (#DIV/0!)
203- [ ] **Références invalides** : Vérifier que toutes pointent vers cellules existantes (#REF!)
204- [ ] **Références inter-feuilles** : Format correct (Sheet1!A1)
205
206## Bonnes Pratiques
207
208### Sélection de Bibliothèque
209- **pandas** : Analyse de données, opérations en masse, export simple
210- **openpyxl** : Formatage complexe, formules, fonctionnalités Excel spécifiques
211
212### Avec openpyxl
213- Indices de cellules en base 1 (row=1, column=1 = cellule A1)
214- `data_only=True` pour lire valeurs calculées
215- **Attention** : Sauvegarder après `data_only=True` remplace définitivement les formules par les valeurs
216- Pour gros fichiers : `read_only=True` ou `write_only=True`
217
218### Avec pandas
219- Spécifier types de données : `pd.read_excel('file.xlsx', dtype={'id': str})`
220- Pour gros fichiers, colonnes spécifiques : `usecols=['A', 'C', 'E']`
221- Gestion des dates : `parse_dates=['date_column']`
222
223## Style de Code
224
225**IMPORTANT** : Code Python minimal et concis, sans commentaires superflus.
226
227**Pour les fichiers Excel** :
228- Commenter les cellules avec formules complexes
229- Documenter les sources des données hardcodées
230- Inclure notes pour calculs clés