- AI 技能
- 人工智能
- 深度研究
- 数据分析
- 媒体生成
【免费下载链接】SenseNova-Skills
Modular SenseNova skills for building AI-powered office assistants and productivity workflows
本指南以 SenseNova-Skills 仓库中 top-value-coloring 能力子技能为核心,系统讲解“多 Sheet 数据合并 → Top-N 统计筛选 → openpyxl 条件样式高亮 → 格式化导出”的完整数据编织流程。读完本文,你将掌握无表头表格的定位式切片读取、合并单元格前向填充、横向合并与nlargest极值筛选,以及基于 openpyxl 的单元格级样式控制与sandbox:/下载链接规范,可直接复用于经营指标排名、绩效考核 Top-N、异常值视觉标记等办公自动化场景。
技能定位:它是谁,解决什么问题
top-value-coloring 是 sn-da-excel-workflow 工作流中excel-cell-coloring(单元格着色)分类下的一个能力子技能。其 frontmatter 对它的官方定义为:
根据数据规模动态选择处理策略,对多表数据进行合并、统计筛选,并利用 openpyxl 实现关键指标的自动化样式高亮与格式化导出。
在父级工作流的 capability 一览表中,它的功能描述是:“根据数据规模动态选择策略,多表合并、统计筛选,关键指标自动化样式高亮”。同分类下还有 category-coloring(最大分类值行高亮)、duplicate-value-coloring(跨表系数异常标红)、outlier-coloring(超限值/错误单元格高亮)、threshold-cell-coloring(低于均值标绿)——它们共同构成了“识别关键行 → 条件着色”的视觉化输出家族,而 top-value-coloring 负责其中“取 Top-N”这一类最常见的数据编织诉求。
适用场景非常明确:一份 Excel 里分散着多个 Sheet,数据既有维度列又有指标列,且需要把指标最高的前 N 名(如 Top 5)筛出来,再生成一张带排名、带高亮、可直接下载的格式化报告。典型业务包括:月度销售排名、项目绩效 Top-N、能耗/产量极值分析、质量评分前列提取等。
三步流水线总览
该子技能将整个处理拆成三个清晰的 Step,每一步对应一类可复用的工程模式:
| Step | 阶段 | 核心技术 | 产出 |
|---|---|---|---|
| Step1 | 数据提取与编织 | header=None定位切片、ffill合并单元格填充、pd.concat横向合并、pd.nlargestTop-N 筛选 | 清洗后的 Top-N 结构化 DataFrame |
| Step2 | 样式化输出 | openpyxlFont / PatternFill / Border / Alignment、条件着色、列宽与数字格式 | 带排名的格式化analysis_report.xlsx |
| Step3 | 结果交付 | sandbox:/前缀下载链接 | 可被运行环境直接识别并交付给用户的结果文件 |
下面逐 Step 展开,并结合父级工作流与仓库内同族技能做源码级纵深讲解。
Step 1 深度解析:多 Sheet 提取、清洗合并与 Top-N 筛选
Step1 的核心是把“人眼在 Excel 里找重点”翻译成机器可执行的定位逻辑。其代码在 top-value-coloring/SKILL.md 中给出了完整示例:
# 示例:合并两个 Sheet 的数据 # 读取 Sheet1 并清洗 df1 = pd.read_excel(file_path, sheet_name='Sheet1', header=None) # 假设 group_col 在第0列,value_col 在第2列 data1 = df1.iloc[20:, [0, 2]].copy() data1.columns = ['group_col', 'value_col_1'] data1['value_col_1'] = pd.to_numeric(data1['value_col_1'], errors='coerce') data1['group_col'] = data1['group_col'].ffill() # 处理合并单元格产生的缺失 # 读取 Sheet2 并清洗 df2 = pd.read_excel(file_path, sheet_name='Sheet2', header=None) data2 = df2.iloc[5:, [0, 1]].copy() data2.columns = ['value_col_2', 'value_col_3'] # 合并数据 merged_df = pd.concat([data1.reset_index(drop=True), data2.reset_index(drop=True)], axis=1) merged_df = merged_df.dropna(subset=['value_col_1']) # 筛选关键指标前五的数据 top_results = merged_df.nlargest(5, 'value_col_1').copy() # 占位示例:修正特定缺失值 # top_results.loc[top_results['group_col'].isna(), 'group_col'] = 'Default_Value'这段代码浓缩了四类高频实战技巧,逐一拆解:
① 无表头表格的定位式读取。pd.read_excel(..., header=None)表示该 Sheet 没有规范表头行,数据从某个中间行才开始有意义。示例用df1.iloc[20:, [0, 2]]从第 20 行(0 基索引)开始、只取第 0 列和第 2 列,再手动赋列名group_col、value_col_1。这种“按行区间 + 列索引切片”的模式在真实业务表格(如带标题区、说明区的报表)中几乎必然用到;父级工作流的 range-reading 子技能正是同款思路的完整封装。父级工作流的 Key rules 也明确提示:无表头 Sheet 必须用header=None配合位置索引,绝不要依赖自动表头推断。
② 合并单元格缺失值的前向填充。业务表格中“分组维度列”常出现纵向合并单元格,即只有第一个格有值,其余为NaN。data1['group_col'].ffill()用前向填充把上一条有效值向下延续,还原每个数据行真正的归属组。这是 Excel 数据清洗中出现频率最高的一个坑,single-sheet-reading 中同样以df['group_col'] = df['group_col'].ffill()作为合并单元格的标准处理范式。
③ 横向合并的两个前提。pd.concat([data1.reset_index(drop=True), data2.reset_index(drop=True)], axis=1)中,axis=1表示按列方向拼接两个表;而reset_index(drop=True)是必须的——横向拼接依赖索引对齐,若两个 DataFrame 来自不同的切片起点(本例 Sheet1 从第 20 行切、Sheet2 从第 5 行切),原始索引必然错位,不重置索引会导致行错配。合并后再用dropna(subset=['value_col_1'])剔除关键指标为空的行,保证后续 Top-N 计算不掺入噪声。
④ 极值筛选:nlargest而非手动排序。merged_df.nlargest(5, 'value_col_1')直接返回按value_col_1降序的前 5 行。相比sort_values(..., ascending=False).head(5),nlargest语义更聚焦、代码更短,且默认按“遇到并列时保留先出现的行”处理平局(可通过keep参数调整)。从源码结构看,仓库中 category-coloring 走的是“分组汇总 →idxmax找最大值”路线,kpi-metric-analysis 则用sort_values(metric_col, ascending=False)做全量排序——三者分别覆盖“取单一最大”“取 Top-N”“全序排名”三种递进需求,本技能取的是中间档。
关于数据规模的一句话提醒(与父级门控的衔接)。frontmatter 中“根据数据规模动态选择处理策略”并非空话:父级工作流 sn-da-excel-workflow/SKILL.md 规定必须先统计总行数,< 10k行才允许直接pd.read_excel();10k–100k行要先转 Parquet 再反复读取;>= 100k行必须改用 sn-da-large-file-analysis 的流式读取(openpyxlread_only+iter_rows分块转 Parquet)。因此,Step1 的这段代码应视作中小数据量(10k 行以内)的直接读取形态,对应大文件场景需把df1/df2的来源替换为pd.read_parquet()或流式转换产物,后续的切片、ffill、concat、nlargest逻辑完全复用。
Step 2 深度解析:openpyxl 样式化表格的构建
筛选出 Top-N 之后,Step2 负责把结果“画”成一份带视觉重点的 Excel。其完整代码位于 top-value-coloring/SKILL.md:
from openpyxl import Workbook from openpyxl.styles import Font, PatternFill, Alignment, Border, Side output_path = 'analysis_report.xlsx' # 创建工作簿 wb = Workbook() ws = wb.active ws.title = 'Analysis_Results' # 定义样式 header_fill = PatternFill(start_color='4472C4', end_color='4472C4', fill_type='solid') header_font = Font(bold=True, color='FFFFFF', size=12) red_font = Font(color='FF0000', bold=True) # 用于高亮异常或关键值 green_fill = PatternFill(start_color='C6EFCE', end_color='C6EFCE', fill_type='solid') # 用于高亮最大值 thin_border = Border(left=Side(style='thin'), right=Side(style='thin'), top=Side(style='thin'), bottom=Side(style='thin')) center_align = Alignment(horizontal='center', vertical='center') # 写入表头 headers = ['Rank'] + list(top_results.columns) for col, header in enumerate(headers, 1): cell = ws.cell(row=1, column=col, value=header) cell.font = header_font cell.fill = header_fill cell.alignment = center_align cell.border = thin_border # 写入数据并应用样式 for idx, (_, row) in enumerate(top_results.iterrows(), 2): # 写入排名 ws.cell(row=idx, column=1, value=idx-1).border = thin_border # 写入各列数据 for col_idx, value in enumerate(row, 2): cell = ws.cell(row=idx, column=col_idx, value=value) cell.border = thin_border # 逻辑高亮示例:对特定列(如第4列)应用红色字体 if col_idx == 4: cell.font = red_font # 逻辑高亮示例:对超过阈值的值应用绿色填充 # if isinstance(value, (int, float)) and value > threshold_val: # cell.fill = green_fill # 自动调整列宽 column_widths = {'A': 8, 'B': 30, 'C': 15, 'D': 15, 'E': 18} for col, width in column_widths.items(): ws.column_dimensions[col].width = width # 设置数字格式 for row in range(2, ws.max_row + 1): ws.cell(row=row, column=3).number_format = '#,##0' ws.cell(row=row, column=4).number_format = '#,##0.00' wb.save(output_path) print(f"Formatted file saved to: {output_path}")这段代码包含几个值得吃透的工程细节:
样式对象是声明式、可复用的。openpyxl 把字体、填充、边框、对齐分别抽象为Font、PatternFill、Border/Side、Alignment对象,全部先行定义、统一复用。其中PatternFill的start_color与end_color相同、fill_type='solid'是标准实心填充写法,色值为不带#的 6 位 HEX;Border则由四个Side(style='thin')组成细边框。这套样式定义范式在仓库多个子技能中高度一致——例如 threshold-cell-coloring 的92D050绿色填充、large-excel-reading 的00B050高亮绿,均为同一套对象体系,便于横向对照复用。
表头与数据的分区写入。表头行手动用ws.cell(row=1, column=col, value=header)写入并统一套用蓝底(4472C4)白字加粗样式;数据从第 2 行开始,用enumerate(top_results.iterrows(), 2)让idx天然等于 Excel 行号。排名列value=idx-1即 1、2、3… 的 Top-N 序号,逻辑自然。
条件着色的两种典型形态。代码给出了两种可组合的高亮策略:
- 列级标记:
if col_idx == 4: cell.font = red_font——对第 4 列(对应某个敏感指标列)的所有值套红色加粗字体,适合标注“异常项/关键对比项”; - 阈值填充:注释中的
if isinstance(value, (int, float)) and value > threshold_val: cell.fill = green_fill——对超过阈值的数值格填充绿色(C6EFCE是 Excel 经典“浅绿=达标”语义色),取消注释并给定threshold_val即可激活。
这两种模式分别对应同族技能 duplicate-value-coloring 与 formatted-export 中的整行标红思路(PatternFill(start_color='FF0000', ...)),可按需把“单元格级”升级为“整行级”视觉强调。
列宽与数字格式。column_widths = {'A': 8, 'B': 30, 'C': 15, 'D': 15, 'E': 18}通过ws.column_dimensions[col].width逐列设定;number_format则让数字按业务口径呈现——'#,##0'输出千分位整数(适合排名/数量类指标),'#,##0.00'保留两位小数(适合比率/单价类指标)。注意数字格式只影响展示,不改变底层数值,且必须配合真实数值类型写入(Step1 的pd.to_numeric(errors='coerce')已保证这一点),否则格式化不生效。
Step 3 深度解析:sandbox 下载链接规范
最后一步是把成果交付给用户,代码位于 top-value-coloring/SKILL.md:
# 必须使用 sandbox:/ 前缀生成下载链接 print(f"下载分析结果")这是一条强约定:结果文件的下载链接必须以sandbox:/作为前缀。其目的是让运行环境(Agent 沙箱)能够识别并自动把analysis_report.xlsx以可下载文件的形式交付给用户。同样的规范贯穿整个 sn-da-excel-workflow:其导出步骤统一采用print(f"Download"),single-sheet-export 也使用sandbox:{output_path}格式。因此,任何自定义导出逻辑都应严格保持这一前缀,否则用户端将无法正常获取文件。
与数据规模门控的联动:中小文件直读,大文件走 Parquet
frontmatter 中“根据数据规模动态选择处理策略”一句,落实在父级工作流的三级门控表上:
| 总行数 | 读取策略 | 说明 |
|---|---|---|
| < 10k | 直接pd.read_excel() | 无内存压力,本技能 Step1 的直读形态适用 |
| 10k – 100k | pd.read_excel()一次 →to_parquet()→ 后续全部读 Parquet | 避免重复慢读,large-excel-reading 提供完整实现 |
| >= 100k | 必须加载 sn-da-large-file-analysis | 用 openpyxlread_only+iter_rows分块流式转 Parquet,禁止pd.read_excel()全量加载 |
父级工作流还特别规定:统计行数时禁止用pd.read_excel()全量加载,应使用 openpyxlread_only=True模式的iter_rows轻量遍历(该写法对任意文件大小都成立)。这意味着 top-value-coloring 的标准调用姿势是:先用轻量行数统计确定数据量级 → 按门控选择读取路径 → 再进入 Step1 的合并/清洗/筛选 → Step2 样式化 → Step3 输出链接。
此外,父级 Key rules 中对大文件(>= 100k 行)还有三条硬性禁令,对 Top-N 场景同样适用:禁止df.apply(lambda...)与df.iterrows()(改用向量化操作或itertuples());禁止输出全量唯一值或整表;图表生成时禁止搜索字体(应直接使用 sn-da-excel-workflow/SKILL.md 中内置的 SimHei/WenQuanYi 固定字体路径块)。本技能 Step2 中对top_results.iterrows()的使用是合理的——因为nlargest(5)之后 DataFrame 已被压缩到个位数行,逐行迭代开销可忽略;但同样的循环绝不应作用于未筛选的全量数据。
实战注意点与最佳实践小结
结合本技能与父级工作流,落地时请守住以下红线:
- 无表头表格一律
header=None+ 位置索引切片,手动重命名列后再进入业务逻辑; - 合并单元格缺失值必须
ffill()前向填充,否则分组维度会出现大量NaN; - 横向
concat前必须reset_index(drop=True),否则索引错位会静默污染结果; - 数值列先
pd.to_numeric(errors='coerce')再dropna,把“字符串数字/空值/垃圾字符”挡在分析之外; - Top-N 用
nlargest(N, col),并列处理靠keep参数显式声明; - 样式对象集中定义、按需复用;条件着色遵循“列级红字/阈值绿填充/整行标红”的仓库既有范式;
- 导出文件一律
sandbox:/前缀输出下载链接; - 列名可能含空格(父级规则示例
'是否通 过'),索引列时必须用精确字符串; - 子技能按需加载:只
read_file当前 Step 需要的 SKILL.md,不要一次性加载全部 capability,浪费上下文。
扩展阅读路径
本文聚焦的 top-value-coloring 只是 sn-da-excel-workflow 的一个切片。若想形成完整的 Excel 分析闭环,建议按以下路径继续深挖本仓库:
- 全流程编排:阅读父级 sn-da-excel-workflow/SKILL.md,掌握行数统计、门控策略、清洗/筛选/导出与 CJK 字体配置;
- 单元格着色家族:对比 threshold-cell-coloring(低于均值整行标绿)、category-coloring(最大值行标绿)、duplicate-value-coloring 与 outlier-coloring(异常标红),构建完整的条件着色工具箱;
- 大文件引擎:深入 sn-da-large-file-analysis,掌握流式转 Parquet、类型降级(可节省 50%–80% 内存)、
write_only写入等规模化能力; - 分析上游:参考 kpi-metric-analysis 与 single-sheet-export,把“Top-N 高亮”嵌入到单位校验、排序排名、字段重命名与下载交付的更大流水线中。
一句话收束:top-value-coloring 用三段可复用的代码,把“多表编织 + 极值筛选 + 样式高亮 + 链接交付”串成一条零手工、可追溯的自动化链路——这正是 SenseNova-Skills 面向办公自动化场景的核心设计意图:把 Excel 里的“重点”,变成一行一行、一色一色的确定性输出。
- AI 技能
- 人工智能
- 深度研究
- 数据分析
- 媒体生成
【免费下载链接】SenseNova-Skills
Modular SenseNova skills for building AI-powered office assistants and productivity workflows
相关推荐
SenseNova-Skills 实战:Excel 跨表系数对比与异常值红色高亮标记(duplicate-value-coloring)
SenseNova Skills 实战:Excel 跨表系数对比与异常值红色高亮标记(duplicate value coloring) 导读 本文围绕 Sen
AI 技能人工智能深度研究数据分析媒体生成Telegraf TopK 处理器深度解析:按聚合函数筛选 Top N 指标序列
Telegraf TopK 处理器深度解析:按聚合函数筛选 Top N 指标序列 TopK 是 Telegraf 中一个典型的"变换(transformatio
可观测性指标监控运维SenseNova-Skills Excel 数据分析编排器:从多 Sheet 读取到报告导出的全流程实战指南
SenseNova Skills Excel 数据分析编排器:从多 Sheet 读取到报告导出的全流程实战指南 导读 本文围绕开源仓库 SenseNova Sk
AI 技能人工智能深度研究数据分析媒体生成
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考