ppt-report-sunbin — 正式汇报 PPT 生成(六种版式 · 五个跨风格模板)
> 1.1.0 重大升级:把原两套独立库(商务 + 深色)拆成 风格 × 配色 的二维架构:
> - 版式 style = 商务 / 深色科技 / 杂志 / 瑞士(四套各自独立的骨架,零冲突)
> - 配色 color = 红 / 蓝 / 绿(仅商务、杂志、瑞士支持;深色科技自带青/蓝/金)
> 加 5 个跨风格通用页面模板(时间轴 / 四象限 / 漏斗 / 流程箭头 / 金句页)——一份内容脚本换 use_style 即可得到四套视觉。
0. 先定逻辑(每次制作的第一步,职场 PPT 的灵魂)
职场 PPT 的差距主要在逻辑,不在配色。动手选版式之前,先完成「逻辑起草」(规则全文见 references/logic_blueprint.md):
- 三问定逻辑:讲给谁(受众)· 想让他记住/同意/做什么(目的)· 全文最想让他带走的一句话(核心结论)。
- 选骨架:默认
S1 结论—依据—行动;改进提案用S2 现状—问题—方案—下一步;选型/对比用S3;多板块并列才用S4。 - 出「逻辑大纲」:每页写四要素 —— 判断句标题 / 结论(一句话)/ 收获(听众带走什么)/ 关系(对比·因果·主次·顺序·总分·并列),按 §5 大纲格式。
- 用户确认:把大纲贴给用户一次确认(不必逐页问);用户已给明确分页大纲时,只做「标题改判断句 + 补每页结论」两件事。
- 自检:
python <skill目录>/scripts/logic_check.py <大纲.md>通过后再进入下面的版式选择与排版。
铁律(逻辑层)
- 标题是判断句,不是栏目名:✗「费用分析」✓「人力成本占期间费用近六成,是管控第一抓手」。
- 每页必须有一句话结论;图表/KPI 页必须带读图结论与来源行,不许裸放图表。
- 收尾页给行动/建议,不以罗列结束。
风格选择(每次开始制作前先问)
用户没有在需求里指定风格时,先贴出下方菜单让用户选(回复编号即可),等用户选定后再动手;
用户已直接说风格(如「红色」「杂志」「瑞士」)则跳过询问。
PPT 用哪种版式?(回复编号即可,如 1)
1. 红色商务风 —— 白底 + 主红 #C0392B|正式职场汇报(推荐/默认)
2. 蓝色商务风 —— 白底 + 主蓝 #1F3864|专业、数据驱动汇报
3. 绿色商务风 —— 白底 + 主绿 #006C57|增长、金融、国企汇报
4. 深色科技风 —— 深空蓝黑底 #0B1220 + 青/金|科技感、炫酷
5. 杂志大标题风 —— 44-56pt 大标题 + 大留白 + 细线分隔|述职/竞聘/年终总结
6. 瑞士极简风 —— 零装饰纯网格 + 主色短线|技术评审 / 政务国企 / 信息量大
规则:
- 编号 → 风格:1=red、2=blue、3=green、4=dark_tech、5=magazine、6=swiss;对应代码库见下方「风格路由表」。
- 编号 1/2/3(红/蓝/绿)共用 business 版式骨架,仅换色板。
- 编号 5/6(杂志/瑞士)支持红/蓝/绿三色板,在 use_style 第二个参数指定。
- 编号 4(深色)无独立配色,色板已内置在深色库。
- 用户答「随便/你定」:默认红色商务风;拿不准先问一句。
- 同一任务沿用首次选择;用户明确要求换风格时才重问。
- 风格选项会随技能更新增加:新增风格时,同步更新本菜单、路由表与代码库;若用户提到列表外的风格,以代码库实际支持为准。
风格路由表
| 用户说法 | 版式参数 | 配色参数 | 风格模块 | 主色 |
|---|---|---|---|---|
| 「红色」「商务红」汇报 | business |
red |
styles/business.py |
#C0392B |
| 「蓝色」「藏蓝」/数据汇报 | business |
blue |
styles/business.py |
#1F3864 |
| 「绿色」「深绿」/增长·金融·国企 | business |
green |
styles/business.py |
#006C57 |
| 「深色」「科技感」「炫酷」 | dark_tech |
无(内置) | styles/dark_tech.py |
#0B1220 底 + 青/蓝/金 |
| 「杂志」「大标题」「气场足」 | magazine |
red / blue / green |
styles/magazine.py |
同色系大字号 |
| 「瑞士」「极简」「克制严肃」 | swiss |
red / blue / green / gray |
styles/swiss.py |
主色只作短线点缀 |
用户未指定:见上方菜单;答「随便/你定」默认红色商务风(business + red)。
统一入口:scripts/ppt_kit.py(推荐写法)
import ppt_kit as kit
P = kit.use_style("business", "red") # ← 换版式只改这一行
prs = kit.new_presentation()
s = kit.new_slide(prs)
kit.title_bar(s, "01", "工作概述", "OVERVIEW")
kit.add_text(s, kit.P["MARGIN"], 1.9, kit.P["CONTENT_W"], 1.0,
[[("本季度围绕三条主线推进……", 14, False, P["GRAY"])]], font=P["FONT"])
kit.save(prs, "汇报.pptx")
- 旧脚本(直接
from business_ppt_kit import *或from ppt_dark_kit import *)继续可用,没改一行就兼容(两套 kit 已降级为兼容壳)。 - 新脚本一律走
ppt_kit,一个入口走遍所有版式。 kit.use_style(style, color)返回色板 dict(MAIN/ACCENT/INK/GRAY/MARGIN/CONTENT_W/FONT…),供内容脚本精确取色。
跨风格页面模板(5 个,任意版式都能用)
scripts/templates/ 下提供 5 个跨风格通用页面模板——它们的取色、容器材质都跟当前版式走,
同一份内容脚本换 use_style 即可得到 4 套视觉,而代码一行不用改。
| 模板 | 调用 | 用途 |
|---|---|---|
| 时间轴(横向 / 纵向) | kit.timeline(items, orient="h"/"v") |
推进节奏、大事记、季度回顾 |
| 四象限矩阵 | kit.matrix_2x2(quadrants, axis_x=…, axis_y=…) |
优先级矩阵、SWOT、风险评估 |
| 漏斗 | kit.funnel(stages) |
转化漏斗、招聘漏斗、用户旅程 |
| 流程箭头 | kit.process_flow(steps) |
实施路径、工作流、审批流 |
| 金句页 | kit.quote_page(text, author=…, sub=…) |
章节扉页 / 结论页 / 总结页 |
写法示例:
P = kit.use_style("magazine", "blue")
prs = kit.new_presentation()
s = kit.new_slide(prs)
kit.title_bar(s, "01", "推进节奏", "TIMELINE")
kit.timeline(s, [
("Q1", "完成选型", "3 家供应商 POC"),
("Q2", "试点上线", "2 个部门试运行"),
("Q3", "全量推广", "8 个部门铺开"),
("Q4", "效果复盘", "效率提升 34%"),
])
模板的颜色全部从当前风格的色板取(MAIN/ACCENT/INK/GRAY/LINE),
因此 red 商务 + 蓝色杂志 + 深色科技各自出来的视觉差异是天然的——不需要为模板写多份代码。
一、浅色商务风(red / blue / green)→ scripts/business_ppt_kit.py
主题色板(use_theme 切换)
| 令牌 | 红 red | 蓝 blue | 绿 green | 用途 |
|---|---|---|---|---|
MAIN |
C0392B |
1F3864 |
006C57 |
主色:标题竖条、方块、本季柱、表头、数字 |
MAIN_DARK |
A93226 |
1B2A4A |
00503F |
深色备用 |
ACCENT |
C0392B |
2E75B6 |
00A878 |
点缀 |
CARD_BG |
F5F5F5 |
F2F5FA |
EAF4F0 |
卡片/隔行底 |
BAR_BASE |
E0E0E0 |
D9E2F3 |
D5E8E0 |
柱状图基准 |
中性色共用:INK 2B2B2B 正文 / GRAY 8A8A8A 次要 / LINE E3E3E3 / WHITE;微软雅黑;16:9 画布 13.333"×7.5"。
组件函数
new_presentation / new_slide / save(prs, path)、add_text、add_rect、
add_title_bar(主题色竖条+编号+标题+英文小字)、add_point(主题色方块项目符号)、
add_compare_bars(自绘双柱:基准灰 vs 本季主色)、add_stat_cards(底部小指标)、
data_page(左文右图标准数据页;右图回调默认自绘,若该维度在 Excel 分析文件中已有原生图表,则改为 add_chart_slot 占位,生成后跑 embed_native_charts.py --theme red|blue|green 得主题化原生图表,见「图表素材」节)、add_chart_slot(Excel 原生图表占位框,命名 chart-slot:<工作表>[:<序号]>)、add_metric_table(主色底表头指标总表)。
组件内不要硬编码颜色,强调色用 MAIN / ACCENT。
> ⚠️ 主题色取色(重要,避免红绿混用):business_ppt_kit 导入时默认主题为红,
> 因此不要用 from business_ppt_kit import * 后直接引用 MAIN/ACCENT 再切主题——
> import * 只拷贝一次绑定(导入那一刻是红色),之后再 use_theme("green") 不会更新
> 脚本里已拷贝的 MAIN,会造成部分页面红、部分页面绿。
> 正确取色:import business_ppt_kit as kit 后 P = kit.use_theme("green"),
> 用返回值 P["MAIN"] / P["ACCENT"] / P["INK"] / P["CARD_BG"] …(或任意时刻 kit.get_theme())。
> 推荐改用 ppt_kit 统一入口(见上),从源头避免该陷阱。
写法模板(主题色用 use_theme 返回值取,勿依赖 import * 的拷贝)
import business_ppt_kit as kit
# 脚本放在其它目录时,先加:sys.path.insert(0, r"<skill安装目录>\ppt-report-sunbin\scripts")
P = kit.use_theme("blue") # 返回当前主题全部色值;red/green/blue 三选一
prs = kit.new_presentation()
# ……逐页调用组件:kit.add_title_bar / kit.data_page / kit.add_chart_slot / kit.add_metric_table……
# 直接画形状/文字时用 P 取色:
# kit.add_rect(s, x, y, w, h, fill=P["MAIN"])
# kit.add_text(s, x, y, w, h, [[("标题", 28, True, P["INK"])]])
kit.save(prs, r"<输出路径>\季度汇报.pptx")
关键排版
- 标题栏:主题色竖条 0.12"×0.56" @(0.9,0.72) + 标题 28pt 粗 @(1.18,0.58) + 英文小字 11pt 灰
- 左右边距 0.9",内容宽 11.53";数据页右侧图表区 @(6.9,1.85) 宽 5.5"
- 柱状图:基准
BAR_BASE、本季MAIN、柱宽 1.25"、柱顶数值(灰 13pt / 主色 14pt) - 卡片居中公式
(11.53 − n·卡宽 − (n−1)·间距)/2,常用卡宽 3.55"、间距 0.4" - 表格:表头主色底白字 14pt 粗、隔行换底(白/
CARD_BG)、高亮列主色加粗 - 大段正文 14pt 深灰 + line_spacing=1.5;中文 latin+ea 字体(kit 已处理)
完整示例
scripts/example_business_report.py(红色 14 页:封面/目录/概述/左文右图/活动卡/指标总表/亮点/问题/计划/致谢)
二、深色科技风(dark)→ scripts/ppt_dark_kit.py
色板(模块常量,直接用名字)
BG 0B1220 深空蓝黑底 / BG_SOFT 0F1A30 / CARD 141F36 卡片底 / CARD_ALT 182642 /
BORDER 26375A / LINE 1E2A44 / CYAN 22D3EE 主强调青 / BLUE 3B82F6 次强调蓝 /
GOLD F5C542 关键数字金 / WHITE ECF2FB 主文字 / GRAY 8FA3BF / DIM 5A6B85 /
BODY C7D3E6 表格正文 / TBL_HEAD 1B2A4A / TBL_ROW_A/B / BAR_DIM 2E4166;微软雅黑。
组件函数(注意:模块级单例 prs,直接 save(path))
save(path)、new_slide(footer, decor=True)(深色底+装饰圆环+页脚页码)、
header(slide, title, sub=None)(青方块+标题+分隔线)、card(圆角卡+顶部色条)、
kpi(slide, x, y, w, h, label, value, caption, accent=CYAN, vcolor=WHITE)、
banner、bar_chart(自绘柱状图,深色适配)、dark_table(完成率金色/环比青色高亮)、
txt / rect / hline / ring / dots。
写法模板
# 内容脚本放在 skill 的 scripts/ 目录时,直接 import 即可
from ppt_dark_kit import *
# 脚本放在其它目录时,取消下面一行注释,改成你本机的实际安装路径
# sys.path.insert(0, r"<skill安装目录>\ppt-report-sunbin\scripts")
s = new_slide("2026 Q2 · 作者名", decor=True)
header(s, "本季度工作概览", "OVERVIEW")
card(s, x, y, w, h); kpi(s, x, y, w, h, "指标", "1.2万", "说明")
bar_chart(s, data); dark_table(s, headers, rows)
save(r"<输出路径>\汇报.pptx")
> 深色库每进程一份单例 prs,一个脚本只生成一份;内容脚本与 kit 同目录时直接 import。
> 推荐改用 ppt_kit:P = kit.use_style("dark_tech") 即可,组件调用一致。
关键排版
- KPI 卡内:顶部色条 0.045" + 指标名 12.5pt 灰 + 大数字 25pt 粗(金/青/白)+ 说明 11pt 灰
- 卡片行距:3 卡 4.11"、4 卡 3.075"(13.333" 宽)
- 页眉:青方块 0.14" + 标题 23pt + 分隔线下 1.1" 青色高亮段
- 正文 13-14pt 灰 + line_spacing=1.35;表格完成率金色、环比青色、隔行换底
- 中文 latin+ea+cs 字体(
_set_run_font已处理)
深色科技风同样遵守「Excel 图表优先」:有 Excel 原生图表就先放 Excel 图表,只有 Excel 没有对应口径(如上下半年对比)才用 kit 自绘。
深色页放 Excel 图表必须深色化(深色底 + 白/浅色文字,否则黑字在深色页上看不清):内容脚本在目标位置放深色占位矩形并命名 chart-slot:<工作表>,生成后运行:
python <skill目录>/scripts/embed_native_charts.py <分析文件.xlsx> <深色pptx> --dark --font-size 14
--dark 会在 Excel 侧把图表临时改为深色主题(图表底 0B1220、绘图区 0F1A30、文字 ECF2FB/8FA3BF、折线与数据点青色、柱形蓝色、饼图青/蓝/金逐点、轴淡色;只读打开不保存,源文件不受影响),再粘贴为 PPT 原生图表——图表与深色页面融为一体、白字清晰且可编辑。
自绘(bar_chart 等)仅用于 Excel 中不存在对应图表的页面。
完整示例
scripts/example_dark_report.py(深色 14 页:封面/编号目录/概述三卡/KPI/活动卡+横幅/双栏/自绘柱状图/深色表格/亮点/问题条/计划四宫格+目标横幅/致谢)
三、杂志大标题风(magazine)→ scripts/styles/magazine.py
适用场景
述职 / 竞聘 / 年终总结 / 品牌发布——需要「气场」的场合。用超大字号和细线分隔把标题推到极致,正文让位给标题,靠排版而非装饰传递力量感。
骨架特征(与商务风的差别全在骨架,不在颜色)
- 超大浅色编号(86pt)压在标题左侧作背景装饰
- 标题 44pt 顶天立地,正文区让位给标题
- 边距放宽到 1.0",不对称网格(正文只占左 5.5",右侧留给图)
- 不用卡片,改用 0.75pt 细线分隔,留白是主要的分栏手段
- KPI 用 48pt 超大数字
色板(与商务风同 hex,仅版式不同)
红 C0392B / 蓝 1F3864 / 绿 006C57 三套;正文 INK 1A1A1A 比商务风更黑;中性色 GRAY 8A8A8A / LINE DEDEDE。
写法模板
import ppt_kit as kit
P = kit.use_style("magazine", "blue") # red / blue / green 三选一
prs = kit.new_presentation()
s = kit.new_slide(prs)
kit.title_bar(s, "01", "全年工作概述", "ANNUAL OVERVIEW")
kit.add_text(s, P["MARGIN"], 2.4, 5.5, 1.0,
[[("围绕三条主线推进,核心指标超额达成……",
14, False, P["GRAY"])]], line_spacing=1.5, font=P["FONT"])
kit.save(prs, "汇报.pptx")
完整示例
跑 selftest_styles.py 生成的 selftest_magazine_red/blue/green.pptx 即可看到三套色板的杂志风效果。
四、瑞士极简风(swiss)→ scripts/styles/swiss.py
适用场景
技术评审 / 政务国企汇报 / 信息量大、要求严肃克制的场合。零装饰、纯网格对齐,把视觉噪音降到最低——让内容自己说话。
骨架特征
- 零装饰:无卡片、无圆角、无渐变、无阴影,层级全靠字号与粗细
- 标题 32pt 粗体,上方压一条 0.85" 主色短线
- 边距收紧到 0.75",同样的页面能多塞一栏内容
- 主色只用在两个地方:那条短线 + 关键数字,其余全是黑灰
- 表格无底色,靠极浅灰隔行与细线区分
- 配色还支持
gray(纯墨333333,去色版)
色板(主色只做点缀)
红 C0392B / 蓝 1F3864 / 绿 006C57 / 墨 333333 四套;正文 INK 111111 接近纯黑;中性色 GRAY 6E6E6E / LINE C9C9C9。
写法模板
import ppt_kit as kit
P = kit.use_style("swiss", "gray") # red / blue / green / gray 四选一
prs = kit.new_presentation()
s = kit.new_slide(prs)
kit.title_bar(s, "01", "工作概述", "OVERVIEW")
kit.add_text(s, P["MARGIN"], 1.9, P["CONTENT_W"], 1.5,
[[("围绕三条主线推进……", 13, False, P["INK"])]], line_spacing=1.45, font=P["FONT"])
kit.save(prs, "汇报.pptx")
完整示例
跑 selftest_styles.py 生成的 selftest_swiss_red/blue/green.pptx 即可看到三套色板的瑞士风效果。
图表素材:优先复用 Excel 原生图表(默认路径)
数据汇报 PPT 的图表素材按下述优先级取用,目标是 PPT 与 Excel 分析结果的图表视觉一致;
本规则对六种风格(红/蓝/绿商务、深色科技、杂志、瑞士)一律生效:
- 有 Excel 原生图表 → 用 PPT 原生可编辑图表(msoChart):数据来自配套的 Excel 分析文件
(如 excel-analysis-sunbin 产出的多 sheet 分析 xlsx)且其中已有对应维度的原生图表时,
PPT 必须复用该图表——以 PPT 原生可编辑图表(双击可改数据/格式)嵌入,并做主题化:
图表颜色改成与所选 PPT 风格一致(绿色系 PPT 配绿色系图表、蓝色 PPT 配蓝色系图表……)。
不要用静态 PNG 图片兜底,也不要另起炉灶自绘形状图或用 matplotlib 重画一套风格不同的图。 - Excel 没有对应图表 → 才用形状拼接:仅当该口径在 Excel 分析文件中没有对应图表
(如 PPT 特有的「上半年 vs 下半年」对比、自定义结构条)时,才用 kit 的形状组件自绘
(add_compare_bars/ 自绘柱状 / 横向条),并沿用所选风格色板。
原生图表 + 主题化(默认方案)
- 生成阶段:内容脚本里用
add_chart_slot(slide, x, y, w, h, "工作表"[, 图表序号])
在图表位放占位框,命名chart-slot:<工作表>[:<图表序号>]。 - 二次加工:
scripts/embed_native_charts.py把 Excel 图表粘贴为该位置的 PPT 原生可编辑图表,
并做主题化——颜色与字号在 Excel 侧临时改好后随图表进入 PPT(只读打开不保存,源文件不受影响):
bash # 浅色商务风 red/blue/green:白底+深灰文字,系列=主题 MAIN/ACCENT/同系扩展+中性灰(单系列取主色) python <skill目录>/scripts/embed_native_charts.py <分析文件.xlsx> <目标.pptx> --theme green --font-size 14 # 深色科技风:深底 0B1220 + 白/浅色文字 + 青/蓝/金系列 python <skill目录>/scripts/embed_native_charts.py <分析文件.xlsx> <目标.pptx> --dark --font-size 14 - 要点(均已实测):
Paste()默认即 PPT 原生图表(msoChart),无需PasteSpecial;隐藏实例下
不能访问pasted.Chart,故颜色与字号调整放在 Excel 侧先改再复制;图表系列色按
red/blue/green 各自色板(主色/亮色/深色/同系扩展/中性灰)循环,饼图/复合饼逐扇区上色、
折线按系列上色、柱/条按系列上色。 - 主题化样式对齐 excel-analysis-sunbin 规范(2026-09-05 起):浅色风与深色风主题化时,自动按
excel-analysis-sunbin SKILL.md 的图表规范调整——无网格线 / 无刻度线 / Y 轴轴线隐藏 / X 轴轴线
淡灰#BFBFBF/ 轴刻度 9 号深灰微软雅黑 / Y 轴数字格式#,##0/ 标题 14 号加粗微软雅黑 /
单系列无图例 / 多系列图例靠上 / 折线线宽 2.25 + 圆形标记 size 6 / 饼图无图例 + 类别名 + 占比。
配色仍保留 PPT 主题(红/蓝/绿/深色),保证 Excel 与 PPT 图表视觉一致;尺寸保持按占位框自适应不变。 - 占位尺寸自适应:默认按 Excel 图表原始宽高比在占位框内等比居中(不拉伸),
横版 / 竖版 / 方形图都不会变形,占位框只需给出大致区域即可(data_page 默认 5.5×3.4 可放任意横版图,
竖版条形图放高一点的占位更舒展);想强制铺满占位框加--stretch。 - 失败会报错:成功嵌入才删除占位矩形,失败保留占位便于排查;
只要成功数少于占位总数就以非零码退出(不再静默通过)。 - 依赖:Windows + 已装 Excel 与 PowerPoint +
pip install pywin32。
兜底:导出 Excel 图表为静态 PNG(仅 COM 不可用时)
当本机没有 Excel/PowerPoint 或未装 pywin32,无法走原生图表时,才退回静态 PNG:
python <skill目录>/scripts/export_excel_charts.py <分析文件.xlsx> [输出目录] [--size 8.25x5.1] [--dpi 150] [--font-size 14]
- 遍历每个工作表下的原生图表逐一导出:
<工作表名>_<图表名>.png,默认输出到源文件同目录charts/ --size 8.25x5.1:浅色商务data_page右图区(5.5×3.4 英寸)的 1.5 倍;竖版图(横向条形等)
需单独用竖版尺寸导出,避免被拉变形--dpi 150:导出约 1238×765 px,嵌入 5.5 英寸宽约 225 dpi,投屏清晰--font-size 14:导出前把图表内文字临时放大,解决嵌入后字太小;只读打开不保存- 依赖 Windows + 已装 Excel(PowerShell COM,无需 pywin32);也可让用户手动「Excel 右键图表 → 另存为图片」
嵌入约定(等比、不拉伸)
- 原生图表:由
embed_native_charts.py按占位框尺寸自动放置,无需手工换算。 - PNG 兜底:python-pptx
add_picture不要同时写死宽高造成拉伸;先读 PNG 宽高算比例再等比居中:
from PIL import Image
from pptx.util import Inches
def fit_picture(slide, png, x, y, box_w, box_h):
"""把 png 等比缩放后放入 (x,y) 处 box_w×box_h 英寸框内并居中,不拉伸"""
iw, ih = Image.open(png).size
k = min(box_w / iw, box_h / ih) # 英寸/像素
pw, ph = iw * k, ih * k
slide.shapes.add_picture(png, Inches(x + (box_w - pw) / 2),
Inches(y + (box_h - ph) / 2),
width=Inches(pw), height=Inches(ph))
- 浅色商务
data_page右图区(x=6.9, y=1.85, 5.5×3.4 英寸):横版图(折线/柱形)用 8.25×5.1@150
导出后可fit_picture(s, png, 6.9, 1.85, 5.5, 3.4)铺满;方形图(饼/圆环)按比例居中。
图表清晰度(字太小怎么办)
- 原生图表/图片嵌入后字太小,主因是 Excel 图表内文字字号小(常见轴标签 9pt)+ 版面给图空间小。
- 首选在 Excel 侧放大字号再带入:
--font-size 14(正文标签 14pt,标题自动 +4pt);仍偏小就加到 16。 - 版面允许时给图表更大的区域(整页图 / 半页图),字自然更大更清楚。
通用工作流
- 先定逻辑(每次制作的第一步):按顶部「0. 先定逻辑」与
references/logic_blueprint.md走:三问 → 选骨架 → 出逻辑大纲(判断句标题+结论+收获+关系)→ 用户确认 →logic_check.py <大纲.md>自检通过,才进入选版式。素材已含明确大纲时,至少完成「标题改判断句 + 每页补结论」。 - 环境:Python 3.9+,需
python-pptx(实测 1.0.2 通过;Windows 另建议pywin32以启用 Excel 原生图表嵌入)。
Windows 上实测通过的组合是 Python 3.13 + python-pptx 1.0.2。
⚠️ 阶段分工:生成阶段只需 python-pptx;embed 嵌入与 render_check 渲染校验必须用
装有 pywin32 的解释器(如系统 Python),且本机已装 Excel 与 PowerPoint(COM)。
用错解释器会直接报"缺少 pywin32"。 - 解析源文档:zipfile+正则提取 docx 全文(不依赖第三方库),见两库历史用法。
- 选版式:1-6 编号(见顶部菜单);不确定先问用户。
- 图表素材:数据来自配套 Excel 分析文件且其中有对应维度原生图表的,内容脚本用
add_chart_slot放占位,生成后跑embed_native_charts.py --theme red|blue|green(浅色商务/杂志/瑞士)或--dark(深色)嵌入主题化的 PPT 原生图表;仅 Excel 无对应图表的页面才用 kit 自绘,或 COM 不可用时按「兜底:导出 PNG」处理。 - 写内容脚本:用
ppt_kit统一入口;换版式只改use_style第一行。 - 运行生成:
cd scripts && python 内容脚本.py。 - 代码校验(用户偏好:不截图):python-pptx 读回校验页数、每页标题关键词、表格行列与数据;
应嵌入 Excel 图的页面需存在原生图表(msoChart / graphicFrame 含 c:chart)而非静态 picture。
颜色一致性要查全文件(slide + chart XML 一起查,不能只查图表,否则文字/形状的异色主色会漏掉):
bash # XML 级:一键扫描全部 slide/chart 颜色,绿主题出现红/蓝主色即报错;同时检查占位残留与图表数量 python <skill目录>/scripts/verify_theme_colors.py <汇报.pptx> --theme green --expect-charts 4 # 渲染级:COM 逐页导出 PNG + Pillow 像素检测异色占比(仍不截图,输出量化数字) python <skill目录>/scripts/render_check.py <汇报.pptx> --theme green
两者任一发现异色都会非零退出;浅色主题页面/图表应只见主题主色系(如绿主题
006C57/00A878系)+ 中性色,深色主题为0B1220底 + 青/蓝/金 + 浅色文字。 - 成稿逻辑抽查(可选):
python <skill目录>/scripts/logic_check.py --pptx <汇报.pptx>逐页抽查标题是否为判断句(启发式提示,供人工复核;正式逻辑把关在大纲阶段)。 - 自检脚本(推荐,每次发布前跑):
bash # 跨全版式自检:10 套组合(红/蓝/绿×商务+杂志+瑞士 + 深色) python <skill目录>/scripts/selftest_styles.py [输出目录] # 跨风格模板自检:4 套版式 × 5 个模板 = 20 套结构应一致 python <skill目录>/scripts/selftest_templates.py [输出目录]
已验证
- 红:2026-09-02 孙斌「易效云产品运营 Q2 季度汇报」14 页,逐页校验通过
- 蓝:2026-09-02 教学案例「季度销售数据分析汇报」11 页,逐页校验通过
- 蓝:2026-09-03 教学案例「2025 年度销售数据分析汇报(Excel 图表复用版)」10 页:月度折线 / 区域柱形 / 区域占比饼均直接嵌入 Excel 分析文件导出的 PNG,逐页校验通过
- 深:2026-09-01 孙斌「个人工作汇报 Q2」14 页,kit 复现与手写版逐页一致
- 绿:2026-09-04 教学案例「2025 年度财务数据分析汇报(绿色商务风 · Excel 原生图表主题化版)」11 页:
收支柱/费用复合饼/月度折线/组合图/部门条形/堆叠柱 6 张 Excel 图均以embed_native_charts.py --theme green
嵌入为 PPT 原生可编辑图表,系列色统一绿色系(006C57/00A878 等,无红蓝残留),逐页校验通过 - 深:2026-09-03 教学案例「2025 年度销售数据分析汇报(深色科技风 · Excel 图表复用版)」10 页:月度折线 / 区域柱形 / 区域占比饼以
embed_native_charts.py --dark --font-size 14深色化后嵌入 PPT 原生图表(深底+浅色文字,渲染量化图表区平均亮度约 27),上下半年对比因 Excel 无此口径用形状拼接,逐页校验通过 - 1.1.0 重构(2026-09-04):
- 商务风 14 页与深色 14 页逐页 XML 比对(商务逐字节一致、深色语义一致)
- 全版式自检 10 套(business×3 + dark_tech + magazine×3 + swiss×3)颜色校验全部通过
- 跨风格模板自检 8 套组合(business×3 + dark_tech + magazine×2 + swiss×2)shape 数完全一致
[9, 13, 30, 15, 23, 5]
更新记录
1.2.0(2026-09-05)
- 新增「逻辑起草层」(职场 PPT 的灵魂,逻辑先行):
references/logic_blueprint.md:逻辑起草全流程规范——三问定逻辑、四选骨架(S1 结论-依据-行动默认)、
判断句标题铁律(✗「费用分析」✓「人力成本占六成,是管控第一抓手」)、每页四要素(判断句标题/结论/收获/关系)、
关系→页面模板映射、数据页读图结论+来源行规则、大纲文件格式。scripts/logic_check.py:大纲自检(骨架/标题判断句/四要素/关系合法性,有 error 非零退出)+
成稿抽查(--pptx逐页标题提示)。- SKILL.md 工作流新增「步骤 0 先定逻辑」:三问 → 选骨架 → 出大纲 → 用户确认 → 自检通过后再选版式排版。
1.1.5(2026-09-05)
- embed_native_charts.py 后处理再增一处修复 + Excel COM 同步设(解决折线图 marker 用 diamond 方块而不是 circle 小圆点的问题):
1. Excel COM 层:在两个MarkerForegroundColor / MarkerBackgroundColor / MarkerSize设置块中各加sr.MarkerStyle = 8(xlMarkerStyleCircle),让源 Excel 图表的 marker 就是 circle。
2.EXCEL_MARKER_SIZE从 6 调到 5:用户希望"小圆点",从默认 6 缩到 5。
3. XML 后处理兜底:新增_force_circle_markers(),把所有<c:symbol val="diamond|square|triangle|x|plus|star|dash|picture|circle"/>统一改成<c:symbol val="circle"/>;同时把 marker 块内<c:size val="N"/>统一改为 5。重复运行安全(再次匹配仍得到 circle + 5)。 - 验证:chart1.xml marker 从
diamond/size=6→circle/size=5;3 张 chart XML 仍 well-formed;v1.1.3 / v1.1.4 修复全部保留。
1.1.4(2026-09-05)
- embed_native_charts.py 后处理再增两处修复(解决 PPT 端默认行为造成的两个视觉问题):
1. 标题不叠加 + 强制占顶部布局:PPT 粘贴时把所有图表的标题设成<c:overlay val="1"/>,
导致标题浮在绘图区上方不占布局空间、和柱形/折线/扇区视觉重叠。新增_force_title_top_layout():
把overlay改为 0,给每个c:title注入<c:layout><c:manualLayout>(x=0, y=0, w=1, h=0.12),
让标题强制占顶部 12% 条带,绘图区自动下移不再重叠。
2. 饼图标签强制外置:v1.1.2 在 Excel 侧设了dl.Position = 3 (outEnd),但 PPT 粘贴时
把dLbls里的<c:dLblPos>元素吞掉、默认渲染成inEnd(扇区内)。新增_force_pie_outside_labels():
识别c:pieChart/c:doughnutChart块,给其中每个c:dLbls注入
<c:dLblPos val="outEnd"/>(在 spPr 之后、show* 之前,符合 ECMA-376 schema),
标签显示在扇区外并自动加引线(showLeaderLines=1)。 - v1.1.4 二次修复(2026-09-05 同日 hotfix):上面的 manualLayout 写法写错 schema——
把<c:xMode val="edge"/>写成<c:x mode="edge"><c:val>0</c:val></c:x>,
PowerPoint 解析报错直接打不开文件("发现无法读取的内容")。按 ECMA-376
CT_ManualLayout子节点规范:xMode/yMode/wMode/hMode 都是带val属性的元素,
x/y/w/h 也是带val属性的 double 元素,不是嵌套的<mode><val>结构。
已修正为<c:xMode val="edge"/>+<c:x val="0"/>等 8 个子节点的标准写法。 - 鲁棒性:两个 patch 都做了"已存在则跳过"的检查,重复运行后处理不会重复插入;scope 限定
在饼/圆环图内或单个 title 节点,避免影响柱/折线等其他图表。
1.1.3(2026-09-05)
- embed_native_charts.py 新增
post_process_pptx_charts()XML 后处理:v1.1.2 在 Excel COM 层
改 axis(删网格线 / 改 TickLabelPosition / 改轴线样式)但实际几乎全部失效——根因是源 Excel 图表
axis 是"半残废"配置(catAx 错配 axPos val="l",valAx 缺 numFmt 等),Excel COMAxes().Count=0,
所有ax.HasMajorGridlines = False等调用全被 try/except 静默吞掉;PPT 端粘贴时自动给每个 axis
生成<c:delete val="1"/>+<c:majorGridlines/>,结果就是"轴线全隐藏+网格线还在"。 - 新后处理流程:Excel COM 嵌入完成后,用 zipfile 直接打开 PPTX,对每张 chart XML 做三件事:
1. 物理删除<c:majorGridlines/>/<c:minorGridlines/>节点(无论是否存在都从 XML 移除);
2. 把<c:delete val="1"/>改回val="0",避免 tickLblPos 因 axis 被整体隐藏而失效;
3. 给 catAx/valAx 注入<c:spPr>:Y 轴<a:ln><a:noFill/>(轴线隐形、标签可见)、
X 轴<a:ln><a:solidFill><a:srgbClr val="BFBFBF"/></a:solidFill>(淡灰细线)。 - 这层 XML 后处理不依赖 Excel COM,对任何源 Excel(即使是 axis 配置残废的)都能稳定生效。
1.1.2(2026-09-05)
- embed_native_charts.py 三处补丁:
- 网格线删除强化:
HasMajorGridlines/HasMinorGridlines = False优先(最直接的开关属性),再
Delete(),最后Format.Line.Visible=False兜底——三层都失败时强制隐藏,杜绝 PPT 端仍渲染网格线。 - 强制
TickLabelPosition = xlTickLabelPositionNextToAxis(-4127):v1.1.1 有些图表的
TickLabel 默认落到 High/None/不显示(特别是带数据图表 + 自定义模板的源),强制锁回轴边。 - 饼图
DataLabels.Position = xlLabelPositionOutsideEnd(3):标签从扇区内挪到扇区外面,
避免与扇区颜色冲突看不清。
1.1.1(2026-09-05)
- embed_native_charts.py 主题化样式对齐 excel-analysis-sunbin SKILL.md 图表规范:
浅色风(red/blue/green)与深色风(dark)主题化时,自动应用 Excel-analysis-sunbin 第 60-72 行规定的样式—— - 无主/次网格线(MajorGridlines/MinorGridlines 删除或隐藏)
- 无刻度线(MajorTickMark/MinorTickMark = xlTickMarkNone)
- Y 轴轴线隐藏;X 轴轴线淡灰
#BFBFBF - 轴刻度 9 号深灰
#595959微软雅黑;Y 轴数字格式#,##0 - 标题 14 号加粗微软雅黑
- 单系列或饼图 → 不显示图例;多系列 → 图例靠上
- 折线系列:线宽 2.25、圆形标记 size 6
- 饼图:逐扇区配色 + 类别名 + 占比 + 数字格式
0.0%+ 无图例 - 字体统一微软雅黑(标题/轴刻度/图例/数据标签)
- 配色保留 PPT 主题(红/蓝/绿/深色),与 excel-analysis-sunbin 8 套 palette 解耦——PPT 端的
red/blue/green 对应"主题色",Excel 端 8 套 palette 仍由 excel-analysis-sunbin 自管理。 - 图表尺寸保持按占位框等比自适应(不变为 505×305),PPT 版面布局不受影响。
1.1.0(2026-09-04)
- 架构升级——风格 × 配色二维化:把两套独立库(商务 + 深色)拆成统一架构——
core_ppt.py基础层:画布、字体、形状、图表占位、表格构造器(合并自两套库重复代码)styles/business.py浅色商务(含 red/blue/green 三色板)styles/dark_tech.py深色科技styles/magazine.py杂志大标题风(新;red/blue/green 三色板)styles/swiss.py瑞士极简风(新;red/blue/green/gray 四色板)ppt_kit.py统一入口:use_style(style, color)一行切换版式- 新增跨风格页面模板层(
templates/):时间轴(横/纵)、四象限矩阵、漏斗、流程箭头、金句页——5 个模板跨 4 套版式通用,取色/容器材质都跟当前风格走。 - 兼容壳保留:
business_ppt_kit.py/ppt_dark_kit.py降级为转发壳,老示例脚本(example_business_report / example_dark_report)一字未改仍可运行,逐页回归通过。 - 统一组件契约:所有风格都实现同名组件
title_bar/card/kpi/point/table/add_chart_slot等,内容脚本换use_style不改一行代码。 - 新增自检脚本:
selftest_styles.py—— 10 套版式组合的全套自检 + 颜色校验selftest_templates.py—— 跨风格模板结构一致性校验(shape 数完全一致)
1.0.2(2026-09-04)
- 修复主题色绑定陷阱:
use_theme(name)现在返回当前主题全部色值(主题色+中性色+字体),
并新增get_theme();写法模板与示例改为P = kit.use_theme(...)取色,杜绝
from … import *拷贝旧主题导致的"红绿混用"。示例脚本修复fill=LIGHT未定义问题(改用CARD_BG)。 - 新增一键校验脚本:
verify_theme_colors.py(XML 级全文件颜色一致性 + 占位残留 + 原生图表数量)、
render_check.py(COM 逐页导出 PNG + Pillow 像素异色检测,输出量化占比)。 - embed 更健壮:默认按 Excel 图表原始宽高比在占位框内等比居中(不拉伸),竖版/方形图不再变形;
成功数少于占位总数时非零退出(不再静默跳过);--stretch可恢复强制铺满。