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
CODEBLOCK0
LibreOffice (pour recalcul des formules)
CODEBLOCK1
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
CODEBLOCK2
✅ CORRECT - Formules Excel
CODEBLOCK3
Workflows
Workflow Standard
- 1. 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) : INLINECODE0
- Vérifier et corriger les erreurs détectées
Lecture et Analyse avec pandas
CODEBLOCK4
Création de Fichiers Excel
CODEBLOCK5
Édition de Fichiers Existants
CODEBLOCK6
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 :
CODEBLOCK7
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
CODEBLOCK8
Checklist de Vérification
Vérifications Essentielles
- - [ ] Tester 2-3 références : Vérifier qu'elles tirent les bonnes valeurs
- [ ] Mapping colonnes : Confirmer correspondance (colonne 64 = BL, pas BK)
- [ ] Offset lignes : Excel est 1-indexé (DataFrame row 5 = Excel row 6)
Pièges Courants
- - [ ] Gestion NaN : Vérifier valeurs nulles avec INLINECODE2
- [ ] Colonnes éloignées : Données FY souvent en colonnes 50+
- [ ] Correspondances multiples : Chercher toutes les occurrences
- [ ] Division par zéro : Vérifier dénominateurs (#DIV/0!)
- [ ] Références invalides : Vérifier que toutes pointent vers cellules existantes (#REF!)
- [ ] Références inter-feuilles : Format correct (Sheet1!A1)
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)
- INLINECODE3 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 INLINECODE6
Avec pandas
- - Spécifier types de données : INLINECODE7
- Pour gros fichiers, colonnes spécifiques : INLINECODE8
- Gestion des dates : INLINECODE9
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
OpenClawd 的 Excel 技能
TL;DR
- - 使用公式(而非硬编码值)生成/编辑 Excel 文件。
- 可选:通过 LibreOffice 无头模式进行重新计算并检测 Excel 错误。
- 预期交付物:一个干净的电子表格文件(XLSX/XLSM/CSV/TSV)。
前置条件
Python 依赖
bash
pip install openpyxl pandas xlrd xlwt
LibreOffice(用于公式重新计算)
bash
Ubuntu/Debian
sudo apt-get install libreoffice-calc libreoffice-common
质量标准
专业字体
- - 除非另有说明,否则使用一致的字体(Arial、Times New Roman)
零公式错误
- - 所有 Excel 文件必须无错误交付(#REF!、#DIV/0!、#VALUE!、#N/A、#NAME?)
保留模板
- - 修改时严格保留现有格式和样式
- 现有模板的约定始终优先
财务模型标准
颜色代码(行业标准)
- - 蓝色文本(RGB: 0,0,255):硬编码输入,可修改的值
- 黑色文本(RGB: 0,0,0):所有公式和计算
- 绿色文本(RGB: 0,128,0):指向同一工作簿中其他工作表的链接
- 红色文本(RGB: 255,0,0):指向其他文件的外部链接
- 黄色背景(RGB: 255,255,0):关键假设或需要更新的单元格
数字格式
- - 年份:文本格式(2024 而非 2,024)
- 货币:格式 $#,##0;在标题中指定单位(收入(百万美元))
- 零值:显示为 -(格式:$#,##0;($#,##0);-)
- 百分比:默认格式 0.0%
- 倍数:格式 0.0x(EV/EBITDA、P/E)
- 负数:括号 (123) 而非负号 -123
关键:使用公式,而非硬编码值
始终使用 Excel 公式,而不是在 Python 中计算后硬编码。
❌ 错误 - 硬编码
python
错误:Python 计算后硬编码
total = df[Sales].sum()
sheet[B10] = total # 硬编码 5000
错误:Python 计算增长率
growth = (df.iloc[-1][Revenue] - df.iloc[0][Revenue]) / df.iloc[0][Revenue]
sheet[C5] = growth # 硬编码 0.15
✅ 正确 - Excel 公式
python
正确:让 Excel 计算
sheet[B10] = =SUM(B2:B9)
正确:Excel 公式计算增长率
sheet[C5] = =(C4-C2)/C2
正确:Excel 函数计算平均值
sheet[D20] = =AVERAGE(D2:D19)
工作流程
标准工作流程
- 1. 选择工具:pandas 用于数据,openpyxl 用于公式/格式
- 创建/加载:新建工作簿或打开现有文件
- 修改:数据、公式、格式
- 保存:写入文件
- 重新计算(如有公式则必须执行):python scripts/recalc.py output.xlsx
- 检查并修正检测到的错误
使用 pandas 读取和分析
python
import pandas as pd
读取 Excel
df = pd.read_excel(file.xlsx) # 默认第一张工作表
all
sheets = pd.readexcel(file.xlsx, sheet_name=None) # 所有工作表的字典
分析
df.head() # 预览
df.info() # 列信息
df.describe() # 统计信息
写入
df.to_excel(output.xlsx, index=False)
创建 Excel 文件
python
from openpyxl import Workbook
from openpyxl.styles import Font, PatternFill, Alignment
wb = Workbook()
sheet = wb.active
数据
sheet[A1] = Hello
sheet[B1] = World
sheet.append([Row, of, data])
公式
sheet[B2] = =SUM(A1:A10)
格式
sheet[A1].font = Font(bold=True, color=FF0000)
sheet[A1].fill = PatternFill(solid, start_color=FFFF00)
sheet[A1].alignment = Alignment(horizontal=center)
列宽
sheet.column_dimensions[A].width = 20
wb.save(output.xlsx)
编辑现有文件
python
from openpyxl import load_workbook
加载现有文件
wb = load_workbook(existing.xlsx)
sheet = wb.active # 或 wb[工作表名称]
遍历工作表
for sheet_name in wb.sheetnames:
sheet = wb[sheet_name]
print(f工作表: {sheet_name})
修改
sheet[A1] = 新值
sheet.insert_rows(2) # 插入行
sheet.delete_cols(3) # 删除列
添加工作表
new
sheet = wb.createsheet(新工作表)
new_sheet[A1] = 数据
wb.save(modified.xlsx)
公式重新计算
openpyxl 创建的文件包含公式字符串但不包含计算值。使用 recalc.py 脚本:
bash
python scripts/recalc.py [超时秒数]
该脚本:
- - 首次运行时自动配置 LibreOffice 宏
- 重新计算所有公式
- 扫描所有单元格以查找 Excel 错误
- 返回包含错误详情和位置的 JSON
输出解读
json
{
status: success, // 或 errors_found
total_errors: 0, // 错误总数
total_formulas: 42, // 公式数量
error_summary: { // 如有错误则显示
#REF!: {
count: 2,
locations: [Sheet1!B5, Sheet1!C10]
}
}
}
检查清单
必要检查
- - [ ] 测试 2-3 个引用:验证它们提取了正确的值
- [ ] 列映射:确认对应关系(第 64 列 = BL,而非 BK)
- [ ] 行偏移:Excel 从 1 开始索引(DataFrame 第 5 行 = Excel 第 6 行)
常见陷阱
- - [ ] NaN 处理:使用 pd.notna() 检查空值
- [ ] 远距离列:FY 数据通常在 50 列之后
- [ ] 多重匹配:查找所有出现
- [ ] 除零错误:检查分母(#DIV/0!)
- [ ] 无效引用:验证所有引用指向存在的单元格(#REF!)
- [ ] 跨工作表引用:正确格式(Sheet1!A1)
最佳实践
库选择
- - pandas:数据分析、批量操作、简单导出
- openpyxl:复杂格式、公式、特定 Excel 功能
使用 openpyxl
- - 单元格索引从 1 开始(row=1, column=1 = 单元格 A1)
- 使用 dataonly=True 读取计算值
- 注意:使用 dataonly=True 后保存会永久将公式替换为值
- 大文件:使用 readonly=True 或 writeonly=True
使用 pandas
- - 指定数据类型:pd.readexcel(file.xlsx, dtype={id: str})
- 大文件指定列:usecols=[A, C, E]
- 日期处理:parsedates=[date_column]
代码风格
重要:Python 代码简洁精炼,无多余注释。
对于 Excel 文件:
- - 注释包含复杂公式的单元格
- 记录硬编码数据的来源
- 包含关键计算的说明