McKinsey PPT Design Framework
Overview
This skill encodes the complete design specification for professional business presentations — a consultant-grade PowerPoint framework based on McKinsey design principles. It includes:
- 36 layout patterns across 7 categories (structure, data, framework, comparison, narrative, timeline, team)
- Color system and strict typography hierarchy
- Python-pptx code patterns ready to copy and customize
- Three-layer defense against file corruption (zero
p:styleleaks) - Chinese + English font handling (KaiTi / Georgia / Arial)
All specifications have been refined through iterative user feedback to ensure visual consistency and professional polish.
When to Use This Skill
Use this skill when users ask to:
- Create presentations — pitch decks, strategy presentations, quarterly reviews, board meeting slides, consulting deliverables, project proposals, business plans
- Generate slides programmatically — using python-pptx to produce .pptx files from scratch
- Apply professional design — McKinsey / BCG / Bain consulting style, clean flat design, no shadows or gradients
- Build specific slide types — cover pages, data dashboards, 2x2 matrices, timelines, funnels, team introductions, executive summaries, comparison layouts
- Fix PPT issues — file corruption ("needs repair"), shadow/3D artifacts, inconsistent fonts, Chinese text rendering problems
- Maintain design consistency — unified color palette, font hierarchy, spacing, and line treatments across all slides
Core Design Philosophy
McKinsey Design Principles
Extreme Minimalism - Remove all non-essential visual elements
- No color blocks unless absolutely necessary
- Lines: thin, flat, no shadows or 3D effects
- Shapes: simple, clean, no gradients
- Text: clear hierarchy, maximum readability
Consistency - Repeat visual language across all slides
- Unified color palette (navy + cyan + grays)
- Consistent font sizes and weights for same content types
- Aligned spacing and margins
- Matching line widths and styles
Hierarchy - Guide viewer through information
- Title bar (22pt) → Sub-headers (18pt) → Body (14pt) → Details (9pt)
- Navy for primary elements, gray for secondary, black for divisions
- Visual weight through bold, color, size (not through effects)
Flat Design - No 3D, shadows, or gradients
- Pure solid colors only
- All lines are simple strokes with no effects
- Shapes have no shadow or reflection effects
- Circles are solid fills, not 3D spheres
Design Specifications
Color Palette
All colors in RGB format for python-pptx:
| Color Name | Hex | RGB | Usage | Notes |
|---|---|---|---|---|
| NAVY | #051C2C | (5, 28, 44) | Primary, titles, circles | Corporate, formal tone |
| CYAN | #00A9F4 | (0, 169, 244) | Originally used in v1 | DEPRECATED - Use NAVY for consistency |
| WHITE | #FFFFFF | (255, 255, 255) | Backgrounds, text | On navy backgrounds only |
| BLACK | #000000 | (0, 0, 0) | Lines, text separators | For clarity and contrast |
| DARK_GRAY | #333333 | (51, 51, 51) | Body text, descriptions | Main content text |
| MED_GRAY | #666666 | (102, 102, 102) | Secondary text, labels | Softer tone than DARK_GRAY |
| LINE_GRAY | #CCCCCC | (204, 204, 204) | Light separators, table rows | Table separators only |
| BG_GRAY | #F2F2F2 | (242, 242, 242) | Background panels | Takeaway/highlight areas |
Key Rule: Use navy (#051C2C) everywhere, especially for:
- All circle indicators (A, B, C, 1, 2, 3)
- All action titles
- All primary section headers
- All TOC highlight colors
Accent Colors (for multi-item differentiation)
When a slide contains 3 or more parallel items (e.g., comparison cards, pillar frameworks, multi-category overviews), use these accent colors to create visual distinction between items. Without accent colors, parallel items become visually indistinguishable.
| Accent Name | Hex | RGB | Paired Light BG | Usage |
|---|---|---|---|---|
| ACCENT_BLUE | #006BA6 | (0, 107, 166) | #E3F2FD | First item accent |
| ACCENT_GREEN | #007A53 | (0, 122, 83) | #E8F5E9 | Second item accent |
| ACCENT_ORANGE | #D46A00 | (212, 106, 0) | #FFF3E0 | Third item accent |
| ACCENT_RED | #C62828 | (198, 40, 40) | #FFEBEE | Fourth item / warning |
Accent Color Rules:
- Use accent colors for: card top accent borders (thin 0.06" rect), circle labels (
add_oval()bg param), section sub-headers (font_color) - Use paired light BG for: card background fills only
- Body text inside cards ALWAYS remains DARK_GRAY (#333333)
- NAVY remains the primary color for single-focus elements (one card, one stat, cover title)
- Use accent colors ONLY when the slide has 3+ parallel items that need visual distinction
- The fourth item (D) can use NAVY instead of ACCENT_RED if red feels inappropriate for the content
# Accent color constants
ACCENT_BLUE = RGBColor(0x00, 0x6B, 0xA6)
ACCENT_GREEN = RGBColor(0x00, 0x7A, 0x53)
ACCENT_ORANGE = RGBColor(0xD4, 0x6A, 0x00)
ACCENT_RED = RGBColor(0xC6, 0x28, 0x28)
LIGHT_BLUE = RGBColor(0xE3, 0xF2, 0xFD)
LIGHT_GREEN = RGBColor(0xE8, 0xF5, 0xE9)
LIGHT_ORANGE = RGBColor(0xFF, 0xF3, 0xE0)
LIGHT_RED = RGBColor(0xFF, 0xEB, 0xEE)
Typography System
Font Families
English Headers: Georgia (serif, elegant)
English Body: Arial (sans-serif, clean)
Chinese (ALL): KaiTi (楷体, traditional brush style)
(fallback: SimSun 宋体)
Critical Implementation:
def set_ea_font(run, typeface='KaiTi'):
"""Set East Asian font for Chinese text"""
rPr = run._r.get_or_add_rPr()
ea = rPr.find(qn('a:ea'))
if ea is None:
ea = rPr.makeelement(qn('a:ea'), {})
rPr.append(ea)
ea.set('typeface', typeface)
Every paragraph with Chinese text MUST apply set_ea_font() to all runs.
Font Size Hierarchy
| Size | Type | Examples | Notes |
|---|---|---|---|
| 44pt | Cover Title | "项目名称" | Cover slide only, Georgia |
| 28pt | Section Header | "目录" (TOC title) | Largest body content, Georgia |
| 24pt | Subtitle | Tagline on cover | Cover slide only |
| 22pt | Action Title | Slide title bars | Main content titles, bold, Georgia |
| 18pt | Sub-Header | Column headers, section names | Supporting titles |
| 16pt | Emphasis Text | Bottom takeaway on slide 8 | Callout text, bold |
| 14pt | Body Text | Tables, lists, descriptions | PRIMARY BODY SIZE, all main content |
| 9pt | Footnote | Source attribution | Smallest, gray color only |
No other sizes should be used - stick to this hierarchy exclusively.
Line Treatment (CRITICAL)
Line Rendering Rules
- All lines are FLAT - no shadows, no effects, no 3D
- Remove theme style references - prevents automatic shadow application
- Solid color only - no gradients or patterns
- Width varies by context - see table below
Line Width Specifications
| Usage | Width | Color | Context |
|---|---|---|---|
| Title separator (under action titles) | 0.5pt | BLACK | Below 22pt title |
| Column/section divider (under headers) | 0.5pt | BLACK | Below 18pt headers |
| Table header line | 1.0pt | BLACK | Between header and first row |
| Table row separator | 0.5pt | LINE_GRAY (#CCCCCC) | Between table rows |
| Timeline line (roadmap) | 0.75pt | LINE_GRAY | Background for phase indicators |
| Cover accent line | 2.0pt | NAVY | Decorative bottom-left on cover |
| Column internal divider | 0.5pt | BLACK | Between "是什么" and "独到之处" |
Code Implementation (v1.1 — Rectangle-based Lines)
CRITICAL: Do NOT use slide.shapes.add_connector() for lines. Connectors carry <p:style> elements that reference theme effects and cause file corruption. Instead, draw lines as ultra-thin rectangles:
def add_hline(slide, x, y, length, color=BLACK, thickness=Pt(0.5)):
"""Draw a horizontal line using a thin rectangle (no connector, no p:style)."""
from pptx.util import Emu
h = max(int(thickness), Emu(6350)) # minimum ~0.5pt
return add_rect(slide, x, y, length, h, color)
IMPORTANT: Never use add_connector() — it causes file corruption. Always use add_hline() (thin rectangle).
Post-Save Full Cleanup (v1.1 — Nuclear Sanitization)
After prs.save(outpath), ALWAYS run full cleanup that sanitizes both theme XML and all slide XML:
import zipfile, os
from lxml import etree
def full_cleanup(outpath):
"""Remove ALL p:style from every slide + theme shadows/3D."""
tmppath = outpath + '.tmp'
with zipfile.ZipFile(outpath, 'r') as zin:
with zipfile.ZipFile(tmppath, 'w', zipfile.ZIP_DEFLATED) as zout:
for item in zin.infolist():
data = zin.read(item.filename)
if item.filename.endswith('.xml'):
root = etree.fromstring(data)
ns_p = 'http://schemas.openxmlformats.org/presentationml/2006/main'
ns_a = 'http://schemas.openxmlformats.org/drawingml/2006/main'
# Remove ALL p:style elements from all shapes/connectors
for style in root.findall(f'.//{{{ns_p}}}style'):
style.getparent().remove(style)
# Remove shadows and 3D from theme
if 'theme' in item.filename.lower():
for tag in ['outerShdw', 'innerShdw', 'scene3d', 'sp3d']:
for el in root.findall(f'.//{{{ns_a}}}{tag}'):
el.getparent().remove(el)
data = etree.tostring(root, xml_declaration=True,
encoding='UTF-8', standalone=True)
zout.writestr(item, data)
os.replace(tmppath, outpath)
Text Box & Shape Treatment
Text Box Padding
All text boxes must have consistent internal padding to prevent text touching edges:
bodyPr = tf._txBody.find(qn('a:bodyPr'))
# All margins: 45720 EMUs = ~0.05 inches
for attr in ['lIns','tIns','rIns','bIns']:
bodyPr.set(attr, '45720')
Vertical Anchoring
Text must be anchored correctly based on usage:
| Content Type | Anchor | Code | Notes |
|---|---|---|---|
| Action titles | MIDDLE | anchor='ctr' |
Centered vertically in bar |
| Body text | TOP | anchor='t' |
Default, aligns to top |
| Labels | CENTER | anchor='ctr' |
For circle labels |
anchor_map = {
MSO_ANCHOR.MIDDLE: 'ctr',
MSO_ANCHOR.BOTTOM: 'b',
MSO_ANCHOR.TOP: 't'
}
bodyPr.set('anchor', anchor_map.get(anchor, 't'))
Shape Styling
All shapes (rectangles, circles) must have:
- Solid fill color (no gradients)
- NO border/line (
shape.line.fill.background()) - p:style removed immediately after creation (
_clean_shape()) - No shadow effects (enforced by both inline cleanup and post-save full_cleanup)
def _clean_shape(shape):
"""Remove p:style from any shape to prevent effect references."""
sp = shape._element
style = sp.find(qn('p:style'))
if style is not None:
sp.remove(style)
shape = slide.shapes.add_shape(MSO_SHAPE.RECTANGLE, left, top, width, height)
shape.fill.solid()
shape.fill.fore_color.rgb = BG_GRAY
shape.line.fill.background() # CRITICAL: removes border
_clean_shape(shape) # CRITICAL: removes p:style
Presentation Planning
This section provides mandatory guidance for planning presentation structure, selecting layouts, and ensuring adequate content density. These rules dramatically improve output quality across different LLM models.
Recommended Slide Structures
When creating a presentation, follow these templates unless the user explicitly specifies a different structure:
Standard Presentation (10-12 slides)
Slide 1: Cover Slide (Pattern #1 or #4)
Slide 2: Table of Contents (Pattern #6) — list ALL content sections
Slide 3: Executive Summary / Core Thesis (Pattern #24 or #8+#10)
Slides 4-7: Supporting Arguments (one per slide, vary layouts)
Slides 8-10: Case Studies / Evidence (Pattern #33 or #19)
Slide 11: Synthesis / Roadmap (Pattern #29 or #16)
Slide 12: Key Takeaways + Closing (Pattern #34 or #36)
Short Presentation (6-8 slides)
Slide 1: Cover Slide
Slide 2: Executive Summary (Pattern #24)
Slides 3-5: Core Content (vary layouts: #8, #14, #19, #33)
Slide 6: Synthesis / Timeline (Pattern #29)
Slide 7: Key Takeaways (Pattern #34)
Slide 8: Closing (Pattern #36)
CRITICAL RULES:
- Minimum slide count: 8 slides for any substantive topic. If the user's content supports 10+, generate 10+.
- Never stop early: Generate ALL planned slides in a single script. Do not truncate.
- TOC must list ALL sections: The Table of Contents slide must enumerate every content slide by number and title.
Layout Diversity Requirement
Each content slide MUST use a DIFFERENT layout pattern from its neighbors. Repeating the same layout on consecutive slides makes the presentation feel monotonous and unprofessional.
Match content type to the optimal layout pattern:
| Content Type | Recommended Layouts | Avoid |
|---|---|---|
| Single key statistic | Big Number (#8) | Plain text |
| 2 options comparison | Side-by-Side (#19), Before/After (#20) | Two-column text |
| 3-4 parallel concepts | Three-Pillar (#14), Four-Column (#27), Metric Cards (#10) | Bullet list |
| Process / steps | Process Chevron (#16), Vertical Steps (#30) | Numbered text |
| Timeline | Timeline/Roadmap (#29), Cycle (#31) | Bullet list |
| Data table | Data Table (#9), Scorecard (#22) | Plain text |
| Case study | Case Study (#33): Situation → Approach → Result | Two-column text |
| Summary / conclusion | Executive Summary (#24), Key Takeaway (#25) | Bullet list |
| Multiple KPIs | Three-Stat Dashboard (#12), Two-Stat Comparison (#11) | Plain text |
NEVER use Two-Column Text (#26) for more than 1 slide per deck. It is the least visually engaging layout.
Content Density Requirements
"Minimalism" in McKinsey design means removing decorative noise (shadows, gradients, clip-art), NOT removing content. A slide with 80% whitespace is not minimalist — it is EMPTY.
Mandatory minimums per content slide:
- At least 3 distinct visual blocks — e.g., title bar + content area + takeaway box, or title + left panel + right panel
- Body text area utilization ≥ 50% of the available content space (between title bar at 1.4" and source line at 7.05")
- Action Title must be a FULL SENTENCE expressing the slide's key insight:
- ✅
"连接组约束的AI模型将自由参数减少90%,实现单细胞精度预测" - ❌
"连接组约束的AI模型"
- ✅
- Use specific data points when the user provides them (numbers, percentages, names) — display them prominently with Big Number or Metric Card patterns
- Source attribution (
add_source()) on every content slide with specific references, not generic labels
Mandatory Slide Elements
EVERY content slide (except Cover and Closing) MUST include ALL of these:
| Element | Function | Position |
|---|---|---|
| Action Title | add_action_title(slide, text) |
Top (0.15" from top) |
| Title separator line | Included in add_action_title() |
1.05" from top |
| Content area | Layout-specific content blocks | 1.4" to 6.5" |
| Source attribution | add_source(slide, text) |
7.05" from top |
| Page number | add_page_number(slide, n, total) |
Bottom-right corner |
Page number helper function:
def add_page_number(slide, num, total):
add_text(slide, Inches(12.2), Inches(7.1), Inches(1), Inches(0.3),
f"{num}/{total}", font_size=Pt(9), font_color=MED_GRAY,
alignment=PP_ALIGN.RIGHT)
Layout Patterns
Slide Dimensions
prs.slide_width = Inches(13.333)
prs.slide_height = Inches(7.5)
Widescreen format (16:9), standard for all presentations.
Standard Margin/Padding
| Position | Size | Usage |
|---|---|---|
| Left margin | 0.8" | Default left edge |
| Right margin | 0.8" | Default right edge |
| Top (below title) | 1.4" | Content start position |
| Bottom | 7.05" | Source text baseline |
| Title bar height | 0.9" | Action title bar |
| Title bar top | 0.15" | From slide top |
Slide Type Patterns
1. Cover Slide (Slide 1)
Layout:
- Navy bar at very top (0.05" height)
- Main title centered (44pt, Georgia, navy) at y=2.2"
- Subtitle (24pt, dark gray) at y=3.5"
- Date/info (14pt, med gray) at y=4.5"
- Decorative navy line at x=1", y=6.8" (2" wide, 2pt)
Code template:
s1 = prs.slides.add_slide(prs.slide_layouts[6])
add_rect(s1, 0, 0, prs.slide_width, Inches(0.05), NAVY)
add_text(s1, Inches(1), Inches(2.2), Inches(11), Inches(1.0),
'项目名称', font_size=Pt(44), font_name='Georgia',
font_color=NAVY, bold=True, ea_font='KaiTi')
add_text(s1, Inches(1), Inches(3.5), Inches(11), Inches(0.6),
'副标题描述', font_size=Pt(24),
font_color=DARK_GRAY, ea_font='KaiTi')
add_text(s1, Inches(1), Inches(4.5), Inches(11), Inches(0.5),
'演示文稿 | 2026年3月', font_size=BODY_SIZE,
font_color=MED_GRAY, ea_font='KaiTi')
add_line(s1, Inches(1), Inches(6.8), Inches(4), Inches(6.8),
color=NAVY, width=Pt(2))
2. Action Title Slide (Most Content Slides)
Every main content slide has this structure:
┌─────────────────────────────────────────┐ 0.15"
│ ▌ Action Title (22pt, bold, black) │ ← TITLE_BAR_H = 0.9"
├─────────────────────────────────────────┤ 1.05"
│ │
│ Content area (starts at 1.4") │
│ [Tables, lists, text, etc.] │
│ │
│ │
│ ────────────────────────────────────── │ 7.05"
│ Source: ... │ 9pt, med gray
└─────────────────────────────────────────┘ 7.5"
Code pattern:
s = prs.slides.add_slide(prs.slide_layouts[6])
add_action_title(s, 'Slide Title Here')
# Then add content below y=1.4"
add_source(s, 'Source attribution')
3. Table Layout (Slide 4 - Five Capabilities)
Structure:
- Header row with column names (BODY_SIZE, gray, bold)
- 1.0pt black line under header
- Data rows (1.0" height each, 14pt text)
- 0.5pt gray line between rows
- 3 columns: Module (1.6" wide), Function (5.0"), Scene (5.1")
# Headers
add_text(s4, left, top, width, height, text,
font_size=BODY_SIZE, font_color=MED_GRAY, bold=True)
# Header line (thicker)
add_line(s4, left, top + Inches(0.5), left + full_width, top + Inches(0.5),
color=BLACK, width=Pt(1.0))
# Rows
for i, (col1, col2, col3) in enumerate(rows):
y = header_y + row_height * i
add_text(s4, left, y, col1_w, row_h, col1, ...)
add_text(s4, left + col1_w, y, col2_w, row_h, col2, ...)
add_text(s4, left + col1_w + col2_w, y, col3_w, row_h, col3, ...)
# Row separator
add_line(s4, left, y + row_h, left + full_w, y + row_h,
color=LINE_GRAY, width=Pt(0.5))
4. Three-Column Overview (Slide 5)
Layout:
- Left column (4.1" wide): "是什么"
- Middle column (4.1" wide): "独到之处"
- Right 1/4 (2.5" wide) gray panel: "Key Takeaways"
0.8" 4.9" 5.3" 9.4" 10.0" 12.5"
|-----|-----|-----|-----|------|
│左 │ │ 中 │ │ 右 │
└─────────────────────────────┘
Code:
left_x = Inches(0.8)
col_w5 = Inches(4.1)
mid_x = Inches(5.3)
takeaway_left = Inches(10.0)
takeaway_width = Inches(2.5)
# Left column
add_text(s5, left_x, content_top, col_w5, ...)
add_text(s5, left_x, content_top + Inches(0.6), col_w5, ...,
bullet=True, line_spacing=Pt(8))
# Right gray takeaway area
add_rect(s5, takeaway_left, Inches(1.2), takeaway_width, Inches(5.6), BG_GRAY)
add_text(s5, takeaway_left + Inches(0.15), Inches(1.35), takeaway_width - Inches(0.3), ...,
'Key Takeaways', font_size=BODY_SIZE, color=NAVY, bold=True)
add_text(s5, takeaway_left + Inches(0.15), Inches(1.9), takeaway_width - Inches(0.3), ...,
[f'{i+1}. {t}' for i, t in enumerate(takeaways)], line_spacing=Pt(10))
类别 A:结构导航
5. Section Divider (章节分隔页)
适用场景: 多章节演示文稿的章节过渡页,用于视觉上分隔不同主题模块。
┌──┬──────────────────────────────────────┐
│N │ │
│A │ 第一部分 │
│V │ 章节标题(28pt, NAVY, bold) │
│Y │ 副标题说明文字 │
│ │ │
└──┴──────────────────────────────────────┘
s = prs.slides.add_slide(BL)
add_rect(s, 0, 0, Inches(0.6), SH, NAVY)
add_text(s, Inches(1.2), Inches(2.0), Inches(10), Inches(0.8),
'第一部分', font_size=SUB_HEADER_SIZE, font_color=MED_GRAY, font_name='Georgia')
add_text(s, Inches(1.2), Inches(2.8), Inches(10), Inches(1.2),
'章节标题', font_size=HEADER_SIZE, font_color=NAVY, bold=True, font_name='Georgia')
add_text(s, Inches(1.2), Inches(4.2), Inches(10), Inches(0.6),
'副标题说明文字', font_size=BODY_SIZE, font_color=DARK_GRAY)
6. Table of Contents / Agenda (目录/议程页)
适用场景: 演示文稿开头的目录或会议议程,列出各章节及说明。
┌─────────────────────────────────────────┐
│ ▌ 目录 │
├─────────────────────────────────────────┤
│ │
│ (1) 章节一标题 简要描述 │
│ ───────────────────────────────────── │
│ (2) 章节二标题 简要描述 │
│ ───────────────────────────────────── │
│ (3) 章节三标题 简要描述 │
│ │
└─────────────────────────────────────────┘
s = prs.slides.add_slide(BL)
add_action_title(s, '目录')
items = [('1', '引言与背景', '项目起源与核心问题'),
('2', '市场分析', '竞争格局与机会识别'),
('3', '战略建议', '三大核心行动方案')]
iy = Inches(1.6)
for num, title, desc in items:
add_oval(s, LM, iy, num, size=Inches(0.5))
add_text(s, LM + Inches(0.7), iy, Inches(4.0), Inches(0.4),
title, font_size=SUB_HEADER_SIZE, font_color=NAVY, bold=True)
add_text(s, Inches(5.5), iy + Inches(0.05), Inches(6.5), Inches(0.4),
desc, font_size=BODY_SIZE, font_color=MED_GRAY)
iy += Inches(0.7)
add_hline(s, LM, iy, CONTENT_W, LINE_GRAY)
iy += Inches(0.3)
7. Appendix Title (附录标题页)
适用场景: 正文结束后的附录/备用材料分隔页。
┌─────────────────────────────────────────┐
│ │
│ │
│ 附录 │
│ Appendix │
│ ──────── │
│ 补充数据与参考资料 │
│ │
└─────────────────────────────────────────┘
s = prs.slides.add_slide(BL)
add_rect(s, 0, 0, SW, Inches(0.05), NAVY)
add_text(s, Inches(1), Inches(2.5), Inches(11.3), Inches(1.0),
'附录', font_size=Pt(36), font_color=NAVY, bold=True,
font_name='Georgia', alignment=PP_ALIGN.CENTER)
add_hline(s, Inches(5.5), Inches(3.8), Inches(2.3), NAVY, Pt(1.5))
add_text(s, Inches(1), Inches(4.2), Inches(11.3), Inches(0.5),
'补充数据与参考资料', font_size=BODY_SIZE, font_color=MED_GRAY,
alignment=PP_ALIGN.CENTER)
类别 B:数据统计
8. Big Number / Factoid (大数据展示页)
适用场景: 用一个醒目的大数字引出核心发现或关键数据点。
┌─────────────────────────────────────────┐
│ ▌ Action Title │
├─────────────────────────────────────────┤
│ │
│ ┌─NAVY─────────┐ │
│ │ 95% │ 右侧上下文说明 │
│ │ 子标题 │ 详细解释数据含义 │
│ └──────────────┘ │
│ │
│ ┌─BG_GRAY──────────────────────────┐ │
│ │ 关键洞见:详细分析文字 │ │
│ └──────────────────────────────────┘ │
└─────────────────────────────────────────┘
s = prs.slides.add_slide(BL)
add_action_title(s, '关键发现标题')
add_rect(s, LM, Inches(1.4), Inches(3.5), Inches(1.8), NAVY)
add_text(s, LM + Inches(0.2), Inches(1.5), Inches(3.1), Inches(0.8),
'95%', font_size=Pt(44), font_color=WHITE, bold=True,
font_name='Georgia', alignment=PP_ALIGN.CENTER)
add_text(s, LM + Inches(0.2), Inches(2.3), Inches(3.1), Inches(0.7),
'描述数据含义', font_size=Pt(12), font_color=WHITE, alignment=PP_ALIGN.CENTER)
add_text(s, Inches(5.0), Inches(1.5), Inches(7.5), Inches(2.0),
'上下文说明与详细解释', font_size=BODY_SIZE)
add_rect(s, LM, Inches(4.5), CONTENT_W, Inches(2.2), BG_GRAY)
add_text(s, LM + Inches(0.3), Inches(4.6), Inches(1.5), Inches(0.4),
'关键洞见', font_size=BODY_SIZE, font_color=NAVY, bold=True)
add_text(s, LM + Inches(0.3), Inches(5.1), CONTENT_W - Inches(0.6), Inches(1.4),
['洞见要点一', '洞见要点二', '洞见要点三'], line_spacing=Pt(8))
add_source(s, 'Source: ...')
9. Two-Stat Comparison (双数据对比页)
适用场景: 并排展示两个关键指标的对比(如同比、环比、A vs B)。
┌─────────────────────────────────────────┐
│ ▌ Action Title │
├─────────────────────────────────────────┤
│ │
│ ┌──NAVY───────┐ ┌──BG_GRAY────┐ │
│ │ $2.4B │ │ $1.8B │ │
│ │ 2026年目标 │ │ 2025年实际 │ │
│ └─────────────┘ └─────────────┘ │
│ │
│ 分析说明文字 │
└─────────────────────────────────────────┘
s = prs.slides.add_slide(BL)
add_action_title(s, '对比标题')
stats = [('$2.4B', '2026年目标', True), ('$1.8B', '2025年实际', False)]
sw = Inches(5.5)
sg = Inches(0.733)
for i, (big, small, is_navy) in enumerate(stats):
sx = LM + (sw + sg) * i
fill = NAVY if is_navy else BG_GRAY
bc = WHITE if is_navy else NAVY
sc = WHITE if is_navy else DARK_GRAY
add_rect(s, sx, Inches(1.8), sw, Inches(2.5), fill)
add_text(s, sx + Inches(0.3), Inches(2.0), sw - Inches(0.6), Inches(1.0),
big, font_size=Pt(44), font_color=bc, bold=True,
font_name='Georgia', alignment=PP_ALIGN.CENTER)
add_text(s, sx + Inches(0.3), Inches(3.2), sw - Inches(0.6), Inches(0.5),
small, font_size=BODY_SIZE, font_color=sc, alignment=PP_ALIGN.CENTER)
add_text(s, LM, Inches(5.0), CONTENT_W, Inches(1.5),
'分析说明文字', font_size=BODY_SIZE)
add_source(s, 'Source: ...')
10. Three-Stat Dashboard (三指标仪表盘)
适用场景: 同时展示三个关键业务指标(如 KPI、季度数据)。
┌─────────────────────────────────────────┐
│ ▌ Action Title │
├─────────────────────────────────────────┤
│ ┌──NAVY──┐ ┌──BG_GRAY─┐ ┌──BG_GRAY─┐│
│ │ 数字1 │ │ 数字2 │ │ 数字3 ││
│ │ 小标题 │ │ 小标题 │ │ 小标题 ││
│ └────────┘ └─────────┘ └─────────┘│
│ │
│ 详细说明文字 │
└─────────────────────────────────────────┘
s = prs.slides.add_slide(BL)
add_action_title(s, '三大关键指标')
stats = [('87%', '客户满意度', True),
('+23%', '同比增长', False),
('4.2x', '投资回报率', False)]
sw = Inches(3.5)
sg = (CONTENT_W - sw * 3) / 2
for i, (big, small, is_navy) in enumerate(stats):
sx = LM + (sw + sg) * i
fill = NAVY if is_navy else BG_GRAY
bc = WHITE if is_navy else NAVY
sc = WHITE if is_navy else DARK_GRAY
add_rect(s, sx, Inches(1.4), sw, Inches(1.8), fill)
add_text(s, sx + Inches(0.2), Inches(1.5), sw - Inches(0.4), Inches(0.7),
big, font_size=Pt(28), font_color=bc, bold=True,
font_name='Georgia', alignment=PP_ALIGN.CENTER)
add_text(s, sx + Inches(0.2), Inches(2.25), sw - Inches(0.4), Inches(0.6),
small, font_size=Pt(12), font_color=sc, alignment=PP_ALIGN.CENTER)
add_source(s, 'Source: ...')
11. Data Table with Headers (数据表格页)
适用场景: 结构化数据展示,如财务数据、功能对比矩阵、项目清单。
┌─────────────────────────────────────────┐
│ ▌ Action Title │
├─────────────────────────────────────────┤
│ 列1 列2 列3 列4 │
│ ═══════════════════════════════════ │
│ 数据1-1 数据1-2 ... ... │
│ ─────────────────────────────────── │
│ 数据2-1 数据2-2 ... ... │
│ ─────────────────────────────────── │
│ 数据3-1 数据3-2 ... ... │
└─────────────────────────────────────────┘
s = prs.slides.add_slide(BL)
add_action_title(s, '数据概览')
headers = ['模块', '功能', '状态', '负责人']
col_widths = [Inches(2.5), Inches(4.0), Inches(2.5), Inches(2.7)]
hdr_y = Inches(1.5)
cx = LM
for hdr, cw in zip(headers, col_widths):
add_text(s, cx, hdr_y, cw, Inches(0.4), hdr,
font_size=BODY_SIZE, font_color=MED_GRAY, bold=True)
cx += cw
add_hline(s, LM, Inches(2.0), CONTENT_W, BLACK, Pt(1.0))
# Data rows
rows = [['模块A', '核心功能描述', '已上线', '张三'], ...]
row_h = Inches(0.8)
for ri, row in enumerate(rows):
ry = Inches(2.1) + row_h * ri
cx = LM
for val, cw in zip(row, col_widths):
add_text(s, cx, ry, cw, row_h, val, font_size=BODY_SIZE)
cx += cw
add_hline(s, LM, ry + row_h, CONTENT_W, LINE_GRAY)
add_source(s, 'Source: ...')
12. Metric Cards Row (指标卡片行)
适用场景: 3-4个并排卡片展示独立指标,每个卡片含标题+描述。
┌─────────────────────────────────────────┐
│ ▌ Action Title │
├─────────────────────────────────────────┤
│ ┌─BG_GRAY─┐ ┌─BG_GRAY─┐ ┌─BG_GRAY─┐ │
│ │ (A) │ │ (B) │ │ (C) │ │
│ │ 标题 │ │ 标题 │ │ 标题 │ │
│ │ ─── │ │ ─── │ │ ─── │ │
│ │ 描述 │ │ 描述 │ │ 描述 │ │
│ └─────────┘ └─────────┘ └─────────┘ │
└─────────────────────────────────────────┘
s = prs.slides.add_slide(BL)
add_action_title(s, '核心指标概览')
cards = [('A', '用户增长', '月活用户达到 120 万\n同比增长 35%'),
('B', '营收表现', '季度营收 ¥8,500 万\n超出预期 12%'),
('C', '运营效率', '客诉响应时间 < 2h\n满意度 94%')]
cw = Inches(3.5)
cg = (CONTENT_W - cw * 3) / 2
for i, (letter, title, desc) in enumerate(cards):
cx = LM + (cw + cg) * i
cy = Inches(1.5)
add_rect(s, cx, cy, cw, Inches(4.5), BG_GRAY)
add_oval(s, cx + Inches(1.5), cy + Inches(0.2), letter)
add_text(s, cx + Inches(0.2), cy + Inches(0.8), cw - Inches(0.4), Inches(0.4),
title, font_size=SUB_HEADER_SIZE, font_color=NAVY, bold=True,
alignment=PP_ALIGN.CENTER)
add_hline(s, cx + Inches(0.4), cy + Inches(1.3), cw - Inches(0.8), LINE_GRAY)
add_text(s, cx + Inches(0.2), cy + Inches(1.5), cw - Inches(0.4), Inches(2.5),
desc.split('\n'), line_spacing=Pt(8), alignment=PP_ALIGN.CENTER)
add_source(s, 'Source: ...')
类别 C:框架矩阵
13. 2x2 Matrix (四象限矩阵)
适用场景: 战略分析(如 BCG 矩阵、优先级排序、风险评估)。
┌─────────────────────────────────────────┐
│ ▌ Action Title │
├─────────────────────────────────────────┤
│ 高 Y轴 │
│ ┌─NAVY──────┐ ┌─BG_GRAY───┐ │
│ │ 左上象限 │ │ 右上象限 │ │
│ └───────────┘ └───────────┘ │
│ ┌─BG_GRAY───┐ ┌─BG_GRAY───┐ │
│ │ 左下象限 │ │ 右下象限 │ │
│ └───────────┘ └───────────┘ │
│ 低 高 X轴 │
└─────────────────────────────────────────┘
s = prs.slides.add_slide(BL)
add_action_title(s, '战略优先级矩阵')
mx = LM + Inches(1.5)
my = Inches(1.8)
cw = Inches(4.5)
ch = Inches(2.5)
# Axis labels
add_text(s, mx - Inches(1.3), my + Inches(0.8), Inches(1.1), Inches(0.4),
'高影响', font_size=BODY_SIZE, font_color=NAVY, bold=True, alignment=PP_ALIGN.CENTER)
add_text(s, mx + Inches(0.8), my - Inches(0.5), Inches(3.0), Inches(0.4),
'高可行性', font_size=BODY_SIZE, font_color=NAVY, bold=True, alignment=PP_ALIGN.CENTER)
# Quadrants
add_rect(s, mx, my, cw, ch, NAVY) # best quadrant
add_rect(s, mx + cw + Inches(0.15), my, cw, ch, BG_GRAY)
add_rect(s, mx, my + ch + Inches(0.15), cw, ch, BG_GRAY)
add_rect(s, mx + cw + Inches(0.15), my + ch + Inches(0.15), cw, ch, BG_GRAY)
# Quadrant titles + descriptions
add_text(s, mx + Inches(0.3), my + Inches(0.3), cw - Inches(0.6), Inches(0.5),
'立即执行', font_size=SUB_HEADER_SIZE, font_color=WHITE, bold=True)
# ... repeat for other 3 quadrants with DARK_GRAY text
add_source(s, 'Source: ...')
14. Three-Pillar Framework (三支柱框架)
适用场景: 展示三个并列的核心策略、能力或主题模块。
┌─────────────────────────────────────────┐
│ ▌ Action Title │
├─────────────────────────────────────────┤
│ ┌──NAVY──┐ ┌──NAVY──┐ ┌──NAVY──┐ │
│ │ 标题1 │ │ 标题2 │ │ 标题3 │ │
│ ├────────┤ ├────────┤ ├────────┤ │
│ │ 要点 │ │ 要点 │ │ 要点 │ │
│ │ 要点 │ │ 要点 │ │ 要点 │ │
│ │ 要点 │ │ 要点 │ │ 要点 │ │
│ └────────┘ └────────┘ └────────┘ │
└─────────────────────────────────────────┘
s = prs.slides.add_slide(BL)
add_action_title(s, '三大核心战略')
pillars = [('数字化转型', ['建设数据中台', '打通全渠道', '自动化运营']),
('组织升级', ['扁平化管理', '敏捷团队', '人才梯队']),
('客户深耕', ['精细化运营', '会员体系', 'LTV 提升'])]
pw = Inches(3.5)
pg = (CONTENT_W - pw * 3) / 2
for i, (title, points) in enumerate(pillars):
px = LM + (pw + pg) * i
add_rect(s, px, Inches(1.5), pw, Inches(0.6), NAVY)
add_text(s, px + Inches(0.15), Inches(1.5), pw - Inches(0.3), Inches(0.6),
title, font_size=SUB_HEADER_SIZE, font_color=WHITE, bold=True,
anchor=MSO_ANCHOR.MIDDLE, alignment=PP_ALIGN.CENTER)
add_rect(s, px, Inches(2.1), pw, Inches(4.0), BG_GRAY)
add_text(s, px + Inches(0.2), Inches(2.3), pw - Inches(0.4), Inches(3.5),
[f'• {p}' for p in points], line_spacing=Pt(10))
add_source(s, 'Source: ...')
15. Pyramid / Hierarchy (金字塔/层级图)
适用场景: 展示层级关系(如 Maslow 需求层次、战略-战术-执行分层)。
┌─────────────────────────────────────────┐
│ ▌ Action Title │
├─────────────────────────────────────────┤
│ ┌──NAVY──┐ │
│ │ 愿景 │ 右侧说明 │
│ ┌─┴────────┴─┐ │
│ │ 战略目标 │ 右侧说明 │
│ ┌─┴────────────┴─┐ │
│ │ 执行措施 │ 右侧说明 │
│ └────────────────┘ │
└─────────────────────────────────────────┘
s = prs.slides.add_slide(BL)
add_action_title(s, '战略层级框架')
levels = [('愿景', '成为行业第一', Inches(3.5)),
('战略目标', '三年收入翻倍', Inches(5.0)),
('执行措施', '渠道+产品+组织', Inches(6.5))]
for i, (label, desc, w) in enumerate(levels):
lx = Inches(6.666) - w / 2 # centered
ly = Inches(1.8) + Inches(1.5) * i
h = Inches(1.2)
fill = NAVY if i == 0 else BG_GRAY
tc = WHITE if i == 0 else NAVY
add_rect(s, lx, ly, w, h, fill)
add_text(s, lx + Inches(0.2), ly + Inches(0.1), w - Inches(0.4), Inches(0.4),
label, font_size=SUB_HEADER_SIZE, font_color=tc, bold=True,
alignment=PP_ALIGN.CENTER)
add_text(s, lx + Inches(0.2), ly + Inches(0.55), w - Inches(0.4), Inches(0.5),
desc, font_size=BODY_SIZE, font_color=tc if i == 0 else DARK_GRAY,
alignment=PP_ALIGN.CENTER)
add_source(s, 'Source: ...')
16. Process Chevron (流程箭头页)
适用场景: 线性流程展示(3-5步),如实施路径、业务流程、方法论步骤。
┌─────────────────────────────────────────┐
│ ▌ Action Title │
├─────────────────────────────────────────┤
│ │
│ ┌NAVY┐ -> ┌GRAY┐ -> ┌GRAY┐ -> ┌GRAY┐ │
│ │ S1 │ │ S2 │ │ S3 │ │ S4 │ │
│ └────┘ └────┘ └────┘ └────┘ │
│ 描述 描述 描述 描述 │
│ │
└─────────────────────────────────────────┘
s = prs.slides.add_slide(BL)
add_action_title(s, '实施路径')
steps = [('诊断', '现状评估\n痛点识别'),
('设计', '方案制定\n资源规划'),
('实施', '分阶段落地\n快速迭代'),
('优化', '效果追踪\n持续改进')]
sw = Inches(2.5)
sg = (CONTENT_W - sw * len(steps)) / (len(steps) - 1)
for i, (title, desc) in enumerate(steps):
sx = LM + (sw + sg) * i
fill = NAVY if i == 0 else BG_GRAY
tc = WHITE if i == 0 else NAVY
add_rect(s, sx, Inches(2.0), sw, Inches(1.2), fill)
add_oval(s, sx + Inches(0.1), Inches(2.1), str(i + 1),
bg=WHITE if i == 0 else NAVY, fg=NAVY if i == 0 else WHITE)
add_text(s, sx + Inches(0.6), Inches(2.1), sw - Inches(0.8), Inches(1.0),
title, font_size=SUB_HEADER_SIZE, font_color=tc, bold=True,
anchor=MSO_ANCHOR.MIDDLE)
add_text(s, sx + Inches(0.1), Inches(3.4), sw - Inches(0.2), Inches(1.5),
desc, font_size=BODY_SIZE, alignment=PP_ALIGN.CENTER)
if i < len(steps) - 1:
add_text(s, sx + sw + Inches(0.05), Inches(2.3), Inches(0.4), Inches(0.5),
'->', font_size=SUB_HEADER_SIZE, font_color=NAVY, bold=True)
add_source(s, 'Source: ...')
17. Venn Diagram Concept (维恩图概念页)
适用场景: 展示两三个概念的交集关系(如能力交叉、市场定位)。
┌─────────────────────────────────────────┐
│ ▌ Action Title │
├─────────────────────────────────────────┤
│ ┌──BG──┐ │
│ ╱概念A ╲ │
│ ╱ ┌──┐ ╲ 右侧说明 │
│ │ │交│ │ │
│ ╲ └──┘ ╱ │
│ ╲概念B ╱ │
│ └──────┘ │
└─────────────────────────────────────────┘
s = prs.slides.add_slide(BL)
add_action_title(s, '核心能力交叉')
# Use overlapping rectangles to represent Venn concept
add_rect(s, Inches(1.5), Inches(1.8), Inches(4.5), Inches(4.0), BG_GRAY)
add_text(s, Inches(1.7), Inches(2.0), Inches(2.0), Inches(0.4),
'技术能力', font_size=SUB_HEADER_SIZE, font_color=NAVY, bold=True)
add_rect(s, Inches(3.5), Inches(2.8), Inches(4.5), Inches(4.0), BG_GRAY)
add_text(s, Inches(5.5), Inches(5.5), Inches(2.0), Inches(0.4),
'业务洞察', font_size=SUB_HEADER_SIZE, font_color=NAVY, bold=True)
# Intersection area
add_rect(s, Inches(3.5), Inches(2.8), Inches(2.5), Inches(3.0), NAVY)
add_text(s, Inches(3.7), Inches(3.5), Inches(2.1), Inches(0.8),
'核心\n竞争力', font_size=SUB_HEADER_SIZE, font_color=WHITE, bold=True,
alignment=PP_ALIGN.CENTER)
# Right explanation
add_text(s, Inches(9.0), Inches(2.0), Inches(3.5), Inches(4.0),
'当技术能力与业务洞察交叉时...', font_size=BODY_SIZE)
add_source(s, 'Source: ...')
18. Temple / House Framework (殿堂框架)
适用场景: 展示"屋顶-支柱-基座"的结构(如企业架构、能力体系)。
┌─────────────────────────────────────────┐
│ ▌ Action Title │
├─────────────────────────────────────────┤
│ ┌═══════════NAVY(愿景/屋顶)══════════┐│
│ ├────┤ ├────┤ ├────┤ ├────┤ ││
│ │支柱│ │支柱│ │支柱│ │支柱│ ││
│ │ 1 │ │ 2 │ │ 3 │ │ 4 │ ││
│ ├════╧══╧════╧══╧════╧══╧════╧════════┤│
│ │ 基座(基础能力/文化) ││
│ └──────────────────────────────────────┘│
└─────────────────────────────────────────┘
s = prs.slides.add_slide(BL)
add_action_title(s, '企业能力架构')
# Roof
add_rect(s, LM, Inches(1.5), CONTENT_W, Inches(0.8), NAVY)
add_text(s, LM + Inches(0.3), Inches(1.5), CONTENT_W - Inches(0.6), Inches(0.8),
'企业愿景:成为行业领先的数字化平台',
font_size=SUB_HEADER_SIZE, font_color=WHITE, bold=True,
anchor=MSO_ANCHOR.MIDDLE, alignment=PP_ALIGN.CENTER)
# Pillars
pillars = ['产品力', '技术力', '运营力', '品牌力']
pw = Inches(2.5)
pg = (CONTENT_W - pw * 4) / 3
for i, name in enumerate(pillars):
px = LM + (pw + pg) * i
add_rect(s, px, Inches(2.5), pw, Inches(3.0), BG_GRAY)
add_text(s, px + Inches(0.15), Inches(2.6), pw - Inches(0.3), Inches(0.5),
name, font_size=SUB_HEADER_SIZE, font_color=NAVY, bold=True,
alignment=PP_ALIGN.CENTER)
# Foundation
add_rect(s, LM, Inches(5.7), CONTENT_W, Inches(0.8), NAVY)
add_text(s, LM + Inches(0.3), Inches(5.7), CONTENT_W - Inches(0.6), Inches(0.8),
'基座:数据驱动 + 人才体系 + 企业文化',
font_size=BODY_SIZE, font_color=WHITE
…(truncated)