- AI 技能
- 人工智能
- 深度研究
- 数据分析
- 媒体生成
【免费下载链接】SenseNova-Skills
Modular SenseNova skills for building AI-powered office assistants and productivity workflows
导读
本文围绕开源仓库 SenseNova-Skills 中的sn-da-excel-workflow技能展开,它是一个面向 AI Agent 的 Excel 数据分析多步编排器,将「读取 → 大文件检测 → 数据清洗 → 条件筛选 → 跨 Sheet 聚合 → 导出报告」的完整链路拆解为 6 个可编排步骤,每一步都映射到独立的 capability 子技能。读完本文,你将掌握如何按行数阈值(10k / 100k)动态选择读取策略、如何用 openpyxl 流式读取避免内存溢出、如何用 Parquet 缓存加速重复分析,以及如何通过read_file按需加载子技能模板,在 Agent 环境中稳定地完成从原始 Excel 到带样式、带图表的可下载报告的全流程任务。
一、技能定位:何时触发,何时不触发
sn-da-excel-workflow在仓库中的定位是Excel Analysis Orchestration(Excel 分析编排),详见 README.md 与技能自身的description元数据(skills/sn-da-excel-workflow/SKILL.md)。它的触发条件非常明确,Agent 遇到以下任一情况就应主动加载本技能,而不是自行写几行 pandas 应付了事:
- 用户出现触发词:Excel 分析 / 表格分析 / 数据分析 / 数据清洗 / 数据统计 / 数据筛选 / 数据可视化 / 数据导出 / 汇总统计 / 透视表 / 分组统计 / 交叉分析 / 趋势分析 / 对比分析 / 异常值检测 / 去重 / 缺失值处理 / Excel 报告 / 生成报表,以及英文关键词 analyze Excel / data analysis / data cleaning / pivot table;
- 用户上传或指定了
.xlsx/.xls/.csv文件并要求分析、清洗、统计或可视化; - 任务涉及多 Sheet 读取、条件筛选、分类汇总、图表生成中的任意一项;
- 用户要求导出带格式的 Excel 报告或下载链接。
同时它明确划定了不适用场景:不涉及表格数据的纯文本处理、图片分析(应交给sn-da-image-caption)、单个公式计算的简单问答。这种「触发词 + 文件类型 + 任务类型」的三重判定,是 Agent Skills 规范中"clear triggers"的典型实践(仓库 README 的 Contributing 一节也强调了这一点)。
二、工作流总览:6 步编排,能力逐步下沉
整个工作流以主文档 skills/sn-da-excel-workflow/SKILL.md 为导航骨架,每一步在需要详细代码模式时,通过read_file按需加载对应子技能。6 个步骤为:
| 步骤 | 目标 | 对应 capability 类别 |
|---|---|---|
| Step 1 | 跨 Sheet 统计行数(轻量、不整表加载) | excel-reading/multi-sheet-reading |
| Step 2 | 大文件闸门:按行数选择读取策略 | excel-reading/large-excel-reading |
| Step 3 | 检查 Schema 与数据类型 | excel-reading/range-reading |
| Step 4 | 数据清洗(缺失值、文本标准化、无效字符) | excel-data-cleaning/* |
| Step 5 | 条件筛选与分类提取 | excel-data-filtering/* |
| Step 6 | 导出 Excel/CSV 并提供下载链接 | excel-result-export/* |
下面逐步骤展开,完整继承主文档的代码与参数,并深入各子技能与底层源码验证实现细节。
Step 1:跨 Sheet 统计行数(轻量,不整表加载)
第一步永远是用openpyxlread_only模式逐 Sheet 统计行数,绝不能用pd.read_excel()来数行——后者会把全部数据载入内存,在大文件上会直接 OOM。
import openpyxl, gc wb = openpyxl.load_workbook(file_path, read_only=True, data_only=True) total_rows = 0 sheet_info = {} for name in wb.sheetnames: ws = wb[name] row_count = sum(1 for _ in ws.iter_rows(min_row=2, values_only=True)) total_rows += row_count sheet_info[name] = row_count print(f"Sheet '{name}': {row_count} rows") wb.close() print(f"总行数={total_rows}")关键点说明:
read_only=True让 openpyxl 以流式方式读取工作簿,不把整个 XML 解析进内存;data_only=True返回单元格的缓存值(公式计算结果);min_row=2跳过表头行,统计的是纯数据行;- 循环结束后必须
wb.close()释放句柄。
该步对应的子技能excel-reading/multi-sheet-reading提供了另一种等价的统计实现(skills/sn-da-excel-workflow/capability/excel-reading/multi-sheet-reading/SKILL.md),即用ws.max_row直接取行数后减 1,但主文档强调的iter_rows流式计数方式对任意文件大小都安全,是最稳妥的轻量方案。若需要同时探查列名与行数,可参考上层大文件技能中的inspect_excel()函数(见下文第六节)。
Step 2:大文件闸门(关键——按行数选择策略)
统计出total_rows后,按以下决策表选择后续所有操作的读取策略:
| total_rows | 策略 | 具体做法 |
|---|---|---|
| < 10k | 直接读取 | df = pd.read_excel(file_path, sheet_name=target_sheet) |
| 10k – 100k | Parquet 缓存 | pd.read_excel()读一次 →df.to_parquet()→ 之后所有读取都走 Parquet |
| >= 100k | 停止,加载sn-da-large-file-analysis技能 | 先读其 SKILL.md,再按它的流式读取 + Parquet 模式处理,全程不得使用pd.read_excel()——在 10 万行以上会 OOM 或超时 |
对于 >= 100k 行的文件,主文档明确要求先执行:
read_file(path="<skills_base>/sn-da-large-file-analysis/SKILL.md")然后使用该技能中的stream_excel_to_parquet()函数——它通过 openpyxliter_rows以 50k 行一个 chunk 流式写入 Parquet,内存占用恒定(详见第六节源码剖析)。
对于 10k – 100k 行(仅此区间),使用 Parquet 缓存模式:
import pandas as pd parquet_path = "/tmp/_auto_parquet.parquet" df = pd.read_excel(file_path, sheet_name=target_sheet) df.to_parquet(parquet_path, engine="pyarrow") del df; gc.collect() df = pd.read_parquet(parquet_path)这段代码的精髓在于:pd.read_excel()只在首次转换时调用一次,转换成功后立即del df; gc.collect()释放内存,后续所有分析都从列式存储、带压缩的 Parquet 读取,速度与内存都大幅优于反复读 xlsx。del df; gc.collect()这一内存释放习惯,在 skills/sn-da-large-file-analysis/SKILL.md 的 Best Practices 中被列为第 3 条强制项。
子技能excel-reading/large-excel-reading(skills/sn-da-excel-workflow/capability/excel-reading/large-excel-reading/SKILL.md)完整演示了这一流程:先统计总行数,超过 1 万行即转 Parquet,随后用 openpyxl 生成带条件高亮和自定义样式的格式化 Excel 报告,并在末尾以sandbox:{output_path}格式输出下载链接。
Step 3:检查 Schema 与数据类型
在正式分析前,先预览目标 Sheet 的结构。对大文件(>= 10k 行)只读少量样本,绝不为检查而全量加载:
# For any file size — read only first N rows for inspection df_head = pd.read_excel(file_path, sheet_name=target_sheet, nrows=20) print(f"Columns: {df_head.columns.tolist()}") print(f"Dtypes:\n{df_head.dtypes}") print(df_head.head(10))nrows=20只拉取前 20 行,既能看到列名、dtype 与样例数据,又不会造成内存压力。如果文件已经走完 Step 2 转成了 Parquet,也可以直接pd.read_parquet(parquet_path)后取head()。对应子技能为excel-reading/range-reading(特定区域数据提取,根据数据量动态选择处理策略)。
Step 4:数据清洗
清洗阶段处理三类典型问题:缺失值、文本标准化、无效字符。主文档给出最小可用的清洗骨架:
# Missing values null_count = df[col].isna().sum() # Text cleaning: keep only Chinese characters import re def clean_text(val): if pd.isna(val): return val return "".join(re.findall(r"[\u4e00-\u9fff]", str(val))) or "" df[col] = df[col].apply(clean_text)⚠️大文件规则:当total_rows >= 100k时,不得使用df.apply(lambda...),应改用向量化操作或np.where(),具体可查sn-da-large-file-analysis技能的向量化速查表(见第六节)。
在子技能层面,清洗能力被细分为 6 个方向,各有更完整的实现:
excel-data-cleaning/missing-value-handling(SKILL.md):深度清洗包含合并单元格 ffill 填充、正则去除数字前缀(re.sub(r'^\d+[\.\s\-]+', '', text))、仅保留中英文字符(re.sub(r'[^\u4e00-\u9fa5a-zA-Z0-9]', '', text))、RGB 三通道数值化与黑色像素筛选,最后做跨 Sheet 合计核对与pd.crosstab交叉占比分析;excel-data-cleaning/text-normalization(SKILL.md):对含前缀符号(.,I,■,一,_等)的数值字段逐个剥离前缀并转int,转换失败返回np.nan;对文本列仅保留 Unicode 中文字符区间[\u4e00-\u9fff],结果以新列{原列名}_清洗后追加;excel-data-cleaning/invalid-data-cleaning:正则清洗指定文本列,大文件自动 Parquet 加速;excel-data-cleaning/numeric-format-normalization(SKILL.md):pd.to_numeric(col, errors='coerce')强制数值化,随后把计算合计与汇总 Sheet 中的"合 计"行做一致性核对(用abs(total - expected) < 1e-6处理浮点精度),结果同时导出 xlsx 与 utf-8-sig 编码的 CSV;excel-data-cleaning/duplicate-removal(SKILL.md):基于关键词逐行提取记录、用set()高效去重,输出"唯一项总数"摘要与详细清单两个文件;excel-data-cleaning/outlier-detection(SKILL.md):IQR 方法(Q1 - 1.5*IQR/Q3 + 1.5*IQR)识别异常值,配合偏度/峰度判定分布形态(右偏/左偏/对称、尖峰/平峰/正态趋向),并给出盖帽法clip()或删除法的处理骨架。
Step 5:条件筛选与分类提取
对清洗后的数据应用条件筛选或分类筛选,再进行聚合:
# Condition filter mask = df[col].astype(str).str.strip() == target_value filtered = df[mask] # Category extraction (for headerless layouts) df_raw = pd.read_excel(file_path, sheet_name=sheet, header=None) # Walk rows to find category markers, collect items until next marker两种典型场景:
- 条件筛选:先把目标列转字符串并
strip()去除首尾空格,再做精确等值匹配,避免空格导致的匹配失败; - 无表头布局的分类提取:
header=None读取后用位置索引逐行扫描,遇到分类标记行就开启一个新分组,收集直到下一个标记出现——这类"表头不标准"的场景正是excel-data-filtering/category-filtering的处理对象。
子技能层面对筛选能力的拆解(skills/sn-da-excel-workflow/capability/excel-data-filtering/):
condition-filtering(SKILL.md):多维度清洗与筛选组合拳——同义列名自动识别、RGB 通道过滤、字符串前缀筛选(str.startswith('TXL3'))、pd.to_numeric(errors='coerce')处理脏数据、正则匹配提取(str.contains(r'--pct-')),最后用 openpyxlPatternFill对整行标红后导出;category-filtering(SKILL.md):自定义分类映射 + value_counts 分布统计 + 交叉分析堆叠柱状图,还包含文本内容的多维度评分分级算法(长度 × 30% + 术语密度 × 20% + 是否含数值 × 15% + 复杂概念 × 35%);range-filtering:多维数值条件筛选并导出,支持大规模数据自动性能优化;threshold-filtering(SKILL.md):pd.to_numeric清洗数值列 →dropna剔除无效行 → 阈值比较筛选(如df[col] > 10)→ openpyxl 对命中单元格做样式标记。
Step 6:导出结果
将筛选/清洗后的数据保存为 Excel 或 CSV,并提供下载链接:
output_path = "/mnt/data/result.xlsx" result_df.to_excel(output_path, index=False) print(f"Download")导出层在子技能中细分为 4 个方向(skills/sn-da-excel-workflow/capability/excel-result-export/):
single-sheet-export(SKILL.md):多 Sheet 数据探查 → 条件过滤 → 字段重命名映射(rename_mapping字典)→ 统计各分类数量与占比 → 追加"总计"行 → 导出带下载链接的 Excel;formatted-export(SKILL.md):跨 Sheet 模糊匹配目标列,筛选空值与无效字符(nan/纯空格)记录,导出后对整行标红(PatternFill红色填充);chart-embedded-export:分类分布清洗统计 + 多维交叉分析 + 高分辨率嵌入式图表报告;report-generation-export(SKILL.md):从 Excel 提取多类型数据,分类映射 + 占比/总计行 + 交叉分析 crosstab + 超限值反向搜索(在"限值"行附近正则提取数值做超限判定与严重度分级)+ 饼图报告与sandbox:下载链接。
三、关键规则:Agent 必须遵守的硬性约束
主文档以 Key rules 一节总结了整个工作流的不可违背原则,整理如下:
- 永远先数行数——以 10k 阈值为大文件逻辑的分界;
- >= 100k 行必须加载
sn-da-large-file-analysis技能——不得用pd.read_excel()硬扛; - 列名可能包含空格(如
'是否通 过')——必须用精确字符串索引,不能假设列名无空格; - 无表头 Sheet——用
header=None+ 位置索引; - 大文件(>= 100k 行)禁用清单:
pd.read_excel()全量加载(应改为流式读取 → Parquet);df.apply(lambda...)或df.iterrows()(应改为向量化操作或itertuples());fc-list、find ... fonts、subprocess搜字体、pip install(应使用下文固定的字体路径);- 打印全部唯一值或完整 DataFrame(应使用
.head()、.value_counts().head())。
这些禁令并非教条:pd.read_excel()全量加载在 10 万行以上必然 OOM 或超时;df.apply(lambda)逐行调用 Python 函数比向量化慢 10~100 倍;动态搜字体和装包会拖垮整个会话,且环境未必允许联网安装。以禁止df.iterrows()为例,skills/sn-da-large-file-analysis/SKILL.md 的向量化速查表给出了完整替代:df['col'] * 2替代apply(lambda x: x*2),df.itertuples(index=False)替代df.iterrows(),np.where(df['a']>0,'Y','N')替代map(lambda),df.groupby('a').agg(...)替代groupby.apply(custom_func)。
四、CJK 字体配置(图表生成强制项)
用 matplotlib 生成图表时,必须原样复制下面这段字体配置,禁止用fc-list、find、subprocess或glob去搜索字体——固定路径逐个探测,命中即用:
import os import matplotlib import matplotlib.pyplot as plt import matplotlib.font_manager as fm _FONT_PATHS = [ '/mnt/afs_agents/SimHei.ttf', '/mnt/afs_agents/mnt/data/SimHei.ttf', os.path.expanduser('~/.fonts/SimHei.ttf'), '/usr/share/fonts/truetype/wqy/wqy-zenhei.ttc', '/usr/share/fonts/SimHei.ttf', ] for _p in _FONT_PATHS: if os.path.exists(_p): fm.fontManager.addfont(_p) matplotlib.rcParams['font.family'] = fm.FontProperties(fname=_p).get_name() break matplotlib.rcParams['axes.unicode_minus'] = False这段代码同时覆盖了 5 个可能的字体安装位置(SimHei 与文泉驿正黑),一旦命中就将其注册进 matplotlib 字体管理器并设为全局族名;axes.unicode_minus = False解决负号显示为方块的问题。整个仓库的可视化子技能(柱状图、饼图、折线图、散点图、堆叠图、箱线图、热力图)无一例外都以plt.rcParams['font.sans-serif'] = ['SimHei', ...]开头,例如 skills/sn-da-excel-workflow/capability/excel-data-visualization/pie-chart-visualization/SKILL.md 中的['SimHei', 'DejaVu Sans']、category-statistics 中的['SimHei', 'WenQuanYi Zen Hei', 'Noto Sans CJK JP', 'DejaVu Sans'],读者可以按实际环境选择更宽的回退链。
五、如何加载子技能(按需加载,节省上下文)
主文档的定位是"顶层工作流导航图",子技能才提供每一步的详细实现模板。加载规则如下:
read_file(path="<base_path>/<category>/<sub-skill-name>/SKILL.md")三条硬性规则:
- 只加载当前步骤需要的子技能;
- 不要一次性加载全部子技能——浪费上下文窗口;
- 顶层工作流(本文档)是导航,子技能是实现细节。
子技能的基准路径为:<skills_root>/sn-da-excel-workflow/capability/{category}/{sub-skill}/SKILL.md。目前仓库共收录 9 大类 35 个子技能,各分类与其功能对应如下(完整清单见 skills/sn-da-excel-workflow/capability/):
excel-reading — 读取与解析(7 个)
- single-sheet-reading:读取单个工作表,支持合并单元格处理、交叉分析及多维度可视化
- multi-sheet-reading:读取多工作表,动态评估数据量启用 Parquet 优化,支持正则清洗、分类汇总与线性拟合
- range-reading:特定区域数据提取,根据数据量动态选择处理策略
- large-excel-reading:大型 Excel 文件处理,支持 Parquet 转换提速,生成带条件高亮的格式化报告
- multi-file-reading:多文件读取与统计,支持大文件 Parquet 转换与可视化报告
- specific-sheet-reading:跨 Sheet 特定字段统计、数据清洗与交叉分析,生成带下载链接的汇总报告
- structured-header-reading:动态识别目标列进行统计,正则清洗文本字段提取中文字符
excel-data-cleaning — 数据清洗(6 个)
- missing-value-handling:多 Sheet 智能清洗、跨表核对与可视化分析
- duplicate-removal:多 Sheet 去重统计,生成摘要与明细报表
- invalid-data-cleaning:正则清洗指定文本列(如保留中文字符),大文件自动 Parquet 加速
- text-normalization:文本标准化清洗(去除异常前缀、提取纯中文字符等)
- numeric-format-normalization:数值格式标准化,支持关键指标合计核对与结果文件导出
- outlier-detection:IQR 异常值检测,结合偏度/峰度分析数据分布,适用于非正态数据预处理
excel-data-filtering — 数据筛选(4 个)
- condition-filtering:根据数据规模动态选择处理策略进行条件筛选
- category-filtering:自定义分类统计、交叉分析,支持文本长度/术语密度/正则匹配等综合评分与分级
- range-filtering:根据多维数值条件筛选并导出,支持大规模数据自动性能优化
- threshold-filtering:数值列清洗、条件过滤,使用 openpyxl 对符合条件的单元格进行样式标记
excel-data-analysis — 数据分析(6 个)
- comparison-analysis:两类分类数据对比分析,统计数量差异与比例关系并生成可视化
- group-by-analysis:多 Sheet 数据清洗及分组聚合分析,生成带样式标记的统计表与图表
- kpi-metric-analysis:提取关键指标进行单位一致性验证与排序分析
- pivot-table-analysis:交叉表与热力图进行多维度占比分析,适用于奖项分布/绩效评估/市场占有率
- time-series-analysis:时间序列趋势分析、百分比清洗、绩效分级建模与预测,生成高分辨率可视化报告
- trend-analysis:多维度分级评估与趋势预测,差异化增长率计算,适用于绩效评估/目标设定
excel-data-statistics — 统计计算(4 个)
- basic-statistics:基础统计,支持按条件筛选计算均值,指定行区间提取数据去重求和
- category-statistics:各类别数量与占比统计,生成柱状图/饼图等组合可视化报告
- grouped-statistics:多 Sheet 数据合并与前向填充,分组统计
- percentage-calculation:逐行扫描或列匹配提取关键指标并计算占比/均值,输出结构化报告及图表
excel-data-visualization — 数据可视化(6 个)
- bar-chart-visualization:处理合并单元格,交叉分组统计,生成支持中英文字体的美化柱状图
- histogram-visualization:数值型分布分析与异常值检测,支持正则提取误差项,生成箱线图与直方图
- line-chart-visualization:特征清洗与聚类分析,生成趋势对比/分布特征/参数敏感性多维度图表
- pie-chart-visualization:分类汇总统计,自动识别关键字段生成包含占比/数值的美化饼图
- scatter-plot-visualization:多维度统计分析与散点图可视化
- stacked-chart-visualization:百分比字符串数据处理,补全缺失维度,生成堆叠柱状图展示构成变化趋势
excel-cell-coloring — 单元格着色(5 个)
- category-coloring:提取目标指标计算最大值,对特定行进行高亮标注
- duplicate-value-coloring:对比多表中的特定系数并对异常值进行颜色标记
- outlier-coloring:识别超限数值与错误单元格并进行高亮标注
- threshold-cell-coloring:计算时间序列平均值,使用 openpyxl 输出带条件格式(如低于均值标绿)的报告
- top-value-coloring:根据数据规模动态选择策略,多表合并、统计筛选,关键指标自动化样式高亮
excel-conditional-formatting — 条件格式(1 个)
- data-bar-formatting:从带单位字符串列提取数值并清洗,生成直方图/饼图/条形图/累积分布图
excel-result-export — 结果导出(4 个)
- single-sheet-export:多 Sheet 数据探查与条件过滤导出,重命名字段后生成带下载链接的 Excel
- formatted-export:条件筛选记录并以整行标红格式导出 Excel
- chart-embedded-export:分类分布清洗与统计,生成多维度交叉分析与高分辨率嵌入式图表报告
- report-generation-export:从 Excel 提取多类型数据,生成包含可视化图表与下载链接的综合分析报告
excel-table-styling — 表格样式(1 个)
- table-theme-styling:大文件 Parquet 加速读取,条件筛选/分类汇总与结果导出
六、源码级支撑:与 sn-da-large-file-analysis 的分工与底层实现
sn-da-excel-workflow的 Step 2 明确约定:>= 100k 行必须转交 skills/sn-da-large-file-analysis/SKILL.md。这个上游技能为编排器提供了几个可复用的核心函数,理解其实现能帮助你把握整个工作流在大数据量下的性能边界:
1.inspect_excel()— 不加载数据探查结构。它同样以openpyxl.load_workbook(read_only=True, data_only=True)打开文件,iter_rows(values_only=True)首行作为表头(空值自动命名Col_{j}),其余行计数,返回{sheet_name: {rows, columns}}。这印证了主文档 Step 1"轻量计数"的设计原则。
2.stream_excel_to_parquet()— 10 万行以上的安全通道。函数以chunk_size=50000为界,每攒满一个 chunk 就用 PyArrow 构建全字符串类型的表(避免混合类型列在某 chunk 全为 None 时导致 schema 推断漂移),通过pq.ParquetWriter追加写入,每批写入后gc.collect()回收内存。这就是主文档 Step 2 表格中"openpyxl iter_rows 50k-row chunks with constant memory"的完整实现。
3.convert_excel_to_parquet()— 10k–100k 行的缓存模式。先检查目标 Parquet 是否已存在(存在则直接复用,不做重复转换),否则pd.read_excel()读一次、列名统一转字符串、以snappy压缩写出并清理内存。
4.optimize_dtypes()— 内存压榨。对整型按值域自动降级到 int8/int16/int32,浮点统一转 float32,低基数字符串列(nunique/len < 0.5)转 category,通常可节省 50%–80% 内存。
5.write_large_excel()— 大结果写出策略。超过 100 万行自动转 CSV(Excel 单 Sheet 上限 1,048,576 行);单元格总数超过 5 万用openpyxl Workbook(write_only=True)逐行追加;否则走常规df.to_excel()。
6. 内存估算公式:估算 MB ≈ 行 × 列 × 8 / 1024²(纯数值列),含文本列按 ×50 估算;当估算值超过可用内存 80% 时,应改用pd.read_parquet(columns=[...])按需选列或分块处理。
这套"行数闸门 + 分层读取 + 内存回收"的设计,也直接体现在仓库的端到端示例中:examples/employee-performance-analysis通过sn-da-excel-workflow把 10 份月度绩效 xlsx 对齐列结构合并为一张纵向表,再做月度均线、得分箱线图、38 角色排名等聚合视图;examples/memory-price-end2end-analysis则从报价 CSV 出发完成字段画像、类别与时间戳归一化后再进入深层研究。这两个示例(README.md)可作为本工作流在真实任务中的验收参考。
七、组合使用建议与最佳实践
把主文档的编排思想与仓库内的实现证据结合起来,推荐以下落地顺序:
- 先探测,再决策:无论文件多大,都先用 openpyxl
read_only数清各 Sheet 行数(Step 1),把total_rows作为后续所有分支的唯一依据; - 按量级选通道:<10k 直接读;10k–100k 一次性转 Parquet 缓存;>=100k 必须切换到
sn-da-large-file-analysis的流式通道,全程禁碰pd.read_excel()全量加载; - 清洗用向量化:缺失值、文本标准化、无效字符清理尽量用
pd.to_numeric(errors='coerce')、str访问器、np.where等向量化手段,禁止对大数据框apply(lambda)/iterrows(); - 可视化先配字体:任何 matplotlib 图表生成前,先原样执行主文档的 CJK 字体块,避免中文乱码与负号方块;
- 导出三件套:
result_df.to_excel(output_path, index=False)+print(f"Download"),保证结果可追溯、可下载; - 按需加载子技能:当前步骤需要哪个模板就读哪个
SKILL.md,一次只读一个,避免上下文浪费。
需要特别说明的是,本技能设计运行在 Agent Skills 兼容的运行时中,仓库 README 建议将其部署到 OpenClaw(~/.openclaw/skills/)或 hermes-agent(~/.hermes/skills/),并配合 SenseNova Platform API 使用(安装全流程见 INSTALL.md)。sandbox:前缀的下载链接约定与/mnt/data、/mnt/afs_agents等路径,均以 Agent 沙箱环境的实际挂载为准,读者在自建环境中应替换为可写目录并保持链接格式一致。
结语
sn-da-excel-workflow的价值在于把"Excel 数据分析"这件看似简单、实则极易踩坑的事,固化成了一条以行数为纲、按量级分流的确定性流水线:轻量计数避免内存灾难,Parquet 缓存换来重复分析的常数级提速,流式读取兜底十万行以上场景,再配合 35 个按需加载的 capability 子技能覆盖清洗、筛选、统计、可视化、着色与导出的每一个细分环节。对任何需要在 Agent 中稳定交付 Excel 分析任务的开发者而言,这套"顶层编排 + 子技能下沉"的架构本身就是一份可直接复用的工程模板。
- AI 技能
- 人工智能
- 深度研究
- 数据分析
- 媒体生成
【免费下载链接】SenseNova-Skills
Modular SenseNova skills for building AI-powered office assistants and productivity workflows
相关推荐
SenseNova-Skills 数据分析技能实战指南:从 Excel 多表清洗到大文件流式分析与图像数据提取
SenseNova Skills 数据分析技能实战指南:从 Excel 多表清洗到大文件流式分析与图像数据提取 SenseNova Skills 仓库内置了三个
AI 技能人工智能深度研究数据分析媒体生成MediaCrawler Excel 导出完全指南:把多平台爬取数据变成带格式的多 Sheet 报表
MediaCrawler Excel 导出完全指南:把多平台爬取数据变成带格式的多 Sheet 报表 本文以 MediaCrawler 官方的 Excel 导出
网页爬虫数据工程SenseNova-Skills 演示文稿生成技能全景:从入口编排到 PPTX 导出的端到端实战指南
SenseNova Skills 演示文稿生成技能全景:从入口编排到 PPTX 导出的端到端实战指南 本文档面向在 Hermes / OpenClaw 等 Ag
AI 技能人工智能深度研究数据分析媒体生成
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考