背景
有一段时间,灰灰君 一直在忙着各个现场的投标的事情。很多工作内容都是根据Excel输出对应格式的word文档。但是Excel的内容格式和word输出的内容又各不相同。
为了提升效率、快速交付,灰灰君让 Trae 写了好几个 Python 脚本,顺利完成了任务。
最近,“Skill” 的概念很火,加上手头事情不多,灰灰君就想:能不能把之前那些脚本里的通用逻辑抽出来,封装成几个可复用的 Skill?
例如:
ExcelReader Skill读取和解析Excel文件,输出结构化的Excel数据(JSON格式),包含层级关系。
WordGenerator Skill生成结构化Word文档。
PageAnalyzer Skill
分析HTML页面并生成截图。
Pretty-mermaid Skill
根据传入的内容和主题调用本地的mmdc生成mermaid图
后续或许还能用这些 Skill 重构旧脚本。这次先聚焦第一个——填上 ExcelReader Skill 这个坑,其他的以后再说 😅
技术选型
在 Python 中读取 Excel,主流方案有两个:pandas 和 openpyxl。
考虑到灰灰君的核心需求是“读取数据”而非“精细排版”,最终选择了 pandas。
程序转换
既然之前已经写过多个能跑通的脚本(如 generate_word_from_excel.py、generate_zhejiang_newsma_word.py、intelligent_requirements_doc_generator.py 等),就没必要重复造轮子了。于是让 Trae 参考这些历史代码,提取其中使用 pandas 读取和处理 Excel 的关键逻辑,直接封装成一个 Skill。
参考 generate_word_from_excel.py generate_zhejiang_newsma_word.py intelligent_requirements_doc_generator.py generate_word_from_excel.py generate_zhejiang_newsma_word.py intelligent_requirements_doc_generator.py 这几个脚本中的pandas的读取和处理Excel的方式和细节,帮我在当前目录下生成ExcelReader Skill
执行计划
主要内容:
功能分析与设计
Skill架构设计
输入输出设计
技术实现细节
错误处理
测试计划
集成方案
目录结构:
excel_reader_skill/├── __init__.py├── main.py # 主入口文件├── manifest.yaml # Skill配置文件├── skill.md # Skill说明文档└── utils/ ├── __init__.py ├── excel_parser.py # Excel解析工具 └── logger.py # 日志工具
输入参数:
excel_path:Excel文件路径(必填)
sheet_name:工作表名称(可选,默认第一个)
header_row:表头行号(可选,默认0)
data_start_row:数据起始行(可选,默认header_row+1)
columns:需要读取的列(可选,默认所有列)
merge_cells:是否处理合并单元格(可选,默认True)
特别说明:由于最终输出要用于生成 Word 文档,我们额外引入了一个“层级描述行”的概念:
确认无误后,点击执行按钮开始执行
功能完善与验证
开发完成后,我构造了几组测试数据来验证效果。
示例一:只有表头和数据,无层级描述
程序正确识别出了表头和数据,但是填充的级别为空。
示例二:完整包含表头,级别和数据
初期版本误将第二行(层级描述行)当作普通数据行处理,导致结构错乱。
示例三:完整包含表头,级别和数据,多行数据有合并单元格
程序能识别合并区域,但原始实现中合并单元格对应的数据在 rows 中显示为空。
优化后,合并单元格的值会在其覆盖的所有行中自动填充。
示例四:只有表头和数据,多行数据有合并单元格
数据如下:
修复合并单元格逻辑时,不小心删掉了自动推断层级的代码,又经历几轮调试才恢复。
经过多轮迭代,最终产出了一版相对健壮的 Skill。
示例五:复杂情况
复杂场景:
数据示例如下:
解析结果节选如下:
{ "status": "success", "data": { "sheets": [ { "name": "用户管理应用平台", "header_row": 0, "use_level_desc": true, "level_desc_row": 1, "data_start_row": 1, "columns": [ { "name": "一级", "level_desc": "一级标题", "index": 0 }, { "name": "二级", "level_desc": "二级标题", "index": 1 }, { "name": "二级概述", "level_desc": "正文", "index": 2 }, // ... 其他列 ], "rows": [ { "_index": 1, "一级": "用户管理", "二级": "用户生命周期管理", "二级概述": "覆盖从注册到流失的全周期运营与干预机制", "三级": "用户注册与激活", "三级描述": "支持多种注册方式及自动化欢迎流程", "四级": "手机号/邮箱一键注册", "四级信息": "提供验证码校验与防刷机制", "level_mapping": { "full_path": "用户管理/用户生命周期管理/.../提供验证码校验与防刷机制" } }, // ... 其他行 ], "merged_cells": [ { "start_row": 1, "end_row": 3, "start_col": 1, "end_col": 1, "value": "用户生命周期管理" }, // ... 其他合并区域 ] } ], "metadata": { "file_path": "/Users/.../功能点_示例V4.xlsx", "sheet_count": 1, "row_count": 9, "column_count": 7 } }, "message": "Excel读取成功"}
从结果看,Skill 已能自动处理表头语义、推断层级、填充合并单元格,并构建完整的路径映射,基本满足复杂业务场景需求。
收尾
为方便验证,这个 Skill 最初是在当前工作目录下注册的。待功能稳定后,将其注册为全局 Skill。这样,今后在任意项目中都能直接调用,真正实现“一次封装,处处可用”。