工作流程

1. 明确需求

2. 研究与规划

数据来源:

所需指标:

标准化:

构建前:

3. 逐页创建

关键步骤:每次必须创建一张幻灯片,在继续下一张之前获得用户批准。

对每张幻灯片:

  1. 使用PptxGenJS仅创建这一张幻灯片
  2. 强制要求:转换为图像供审查 - 您必须将幻灯片转换为图像以便进行视觉验证:
    soffice --headless --convert-to pdf presentation.pptx
    pdftoppm -jpeg -r 150 -f 1 -l 1 presentation.pdf slide
  3. 强制视觉审查:在继续前,您必须仔细检查渲染后的幻灯片图像:
  4. 如果检测到任何重叠或截断:按以下顺序立即修复:
  5. 向用户展示幻灯片图像并提供下载链接
  6. 停止并等待用户明确批准,然后再创建下一张幻灯片。在用户确认前不要继续。

您必须在每一页检查这些特定问题:


幻灯片格式要求

信息密度至关重要

首要目标是最大信息密度。 忙碌的高管应在30秒内理解整个公司的情况。将每个象限填满到最大容量。

每个象限的目标:

信息打包技巧:

如果某个象限看起来稀疏,添加更多内容:

行间距——每部分使用单个文本框:

def add_section(slide, x, y, w, header_text, bullets, header_size=10, bullet_size=8):
    """单个文本框中的标题+要点,自然间距"""
    tb = slide.shapes.add_textbox(x, y, w, Inches(len(bullets) * 0.18 + 0.3))
    tf = tb.text_frame
    tf.word_wrap = True

    # 标题段落
    p = tf.paragraphs[0]
    p.text = header_text
    p.font.bold = True
    p.font.size = Pt(header_size)
    p.font.color.rgb = RGBColor(0, 51, 102)
    p.space_after = Pt(6)  # 标题后小间隔

    # 要点段落
    for bullet in bullets:
        p = tf.add_paragraph()
        p.text = bullet
        p.font.size = Pt(bullet_size)
        p.space_after = Pt(3)
    return tb

关键间距原则:


视觉参考

布局灵感参见 examples/Nike_Strip_Profile_Example.pptx。根据每家公司的品牌调整颜色。


首页布局

必须通过忙碌高管的"30秒理解测试"。

幻灯片设置(关键)

使用4:3宽高比(标准IB推介手册格式):

const pptx = new pptxgen();
pptx.layout = 'LAYOUT_4x3';  // 10"宽 × 7.5"高 - 必须使用此设置

幻灯片坐标系

PptxGenJS使用英寸。4:3幻灯片 = 10"宽 × 7.5"高

首页定位(英寸)

┌─────────────────────────────────────────────────────────────────┐
│ y=0.2  标题:公司名称(股票代码)                                │
├────────────────────────────┬────────────────────────────────────┤
│ y=0.6  公司概况            │ y=0.6  业务与定位                  │
│ x=0.3, w=4.7               │ x=5.0, w=4.7                       │
│ h=3.0                      │ h=3.0                              │
├────────────────────────────┼────────────────────────────────────┤
│ y=3.7  关键财务数据        │ y=3.7  股价/近期动态               │
│ x=0.3, w=4.7               │ x=5.0, w=4.7                       │
│ h=3.5                      │ h=3.5                              │
└────────────────────────────┴────────────────────────────────────┘
                                                            y=7.5

标题区域(y=0.2)

公司名称(股票代码) - 示例:Tesla, Inc. (TSLA)

slide.addText('Tesla, Inc. (TSLA)', { x: 0.3, y: 0.2, w: 9.4, h: 0.35, fontSize: 18, bold: true });

4象限布局(y=0.6 至 y=7.2)

象限 位置 内容
1 x=0.3, y=0.6, w=4.7, h=3.0 公司概况:总部、成立年份、关键统计数据、业务摘要(4-5个要点)
2 x=5.0, y=0.6, w=4.7, h=3.0 业务与定位:收入驱动因素、产品/服务、竞争地位、增长驱动因素(4-5个要点)
3 x=0.3, y=3.7, w=4.7, h=3.5 关键财务数据:收入、EBITDA、利润率、EPS、FCF + 估值(市值、EV、倍数)——表格或图表,不要两者都有
4 x=5.0, y=3.7, w=4.7, h=3.5 上市公司:1年股价图 + 主要股东。私有公司:近期动态或所有权/并购历史

字号 - 使用这些精确值

元素 大小 备注
幻灯片标题 24pt 加粗,公司品牌色
象限标题 14pt 加粗,带强调条
正文/要点文本 11pt 常规字重
表格文本 10pt 密集表格可使用9pt
图表标签 9pt 保持标签简短
来源/页脚 8pt 幻灯片底部

关键:如果文本溢出,将字号减小1pt并重新渲染。

视觉强调(必需)

每个象限标题左侧必须有一个彩色强调条:

// 为象限标题添加强调条
slide.addShape(pptx.shapes.RECTANGLE, {
  x: 0.3, y: 0.6, w: 0.08, h: 0.25,
  fill: { color: 'E31937' }  // 使用公司品牌色
});
slide.addText('公司概况', {
  x: 0.45, y: 0.6, w: 4.5, h: 0.3, fontSize: 14, bold: true, fontFace: 'Arial'
});

要包含的视觉元素:

首页格式


后续页面:自由形式布局


图表(多页简介)

对于多页简介:包含2-3个实际的PptxGenJS图表。绝不要使用占位div或静态图像。

对于单页简介:使用表格呈现财务数据(更节省空间)。只有在图表替代表格时才添加图表,而非同时添加。

数据类型 图表类型
收入趋势 折线图或柱状图(多年)
地域分解 水平条形图
产品组合 带百分比的饼图
财务比较 柱状图
股价(1年每日) 折线图

图表代码示例

水平条形图(适用于4:3幻灯片的右下象限):

slide.addChart(pptx.charts.BAR, [{
  name: 'FY2024按地区划分的收入',
  labels: ['北美', 'EMEA', '中国', 'APLA'],
  values: [21.4, 13.6, 7.6, 6.7]
}], {
  x: 5.0, y: 4.1, w: 4.5, h: 3.0,  // 适用于右下象限(4:3)
  barDir: 'bar', chartColors: ['FF6B35'], showValue: true,
  dataLabelFontSize: 10, catAxisLabelFontSize: 10, valAxisLabelFontSize: 10,
  dataLabelFormatCode: '$#,##0.0B',
  title: '按地区划分的收入', titleFontSize: 12, titleBold: true
});

饼图(适用于4:3幻灯片的右下象限):

slide.addChart(pptx.charts.PIE, [{
  name: '产品组合',
  labels: ['鞋类', '服装', '装备'],
  values: [68, 29, 3]
}], {
  x: 5.0, y: 4.1, w: 4.5, h: 3.0,  // 适用于右下象限(4:3)
  showPercent: true, showLegend: true, legendPos: 'r',
  dataLabelFontSize: 10, legendFontSize: 10,
  chartColors: ['FF6B35', '2C2C2C', '4A4A4A'],
  title: 'FY24收入组合', titleFontSize: 12, titleBold: true
});

折线图(后续页面的全宽):

slide.addChart(pptx.charts.LINE, [{
  name: '收入($B)',
  labels: ['FY21', 'FY22', 'FY23', 'FY24', 'FY25E'],
  values: [44.5, 46.7, 48.5, 51.4, 54.2]
}], {
  x: 0.3, y: 1.2, w: 9.4, h: 5.5,  // 4:3幻灯片全宽
  chartColors: ['FF6B35'], showValue: true, lineSmooth: true,
  dataLabelFontSize: 11, catAxisLabelFontSize: 11, valAxisLabelFontSize: 11,
  title: '收入趋势与预测', titleFontSize: 14, titleBold: true
});

财务数据格式

始终使用原生的PptxGenJS表格或图表——绝不要使用纯文本叙述或HTML表格。

对财务数据使用 slide.addTable()(适用于4:3幻灯片的左下象限):

// 先添加带强调条的标题
slide.addShape(pptx.shapes.RECTANGLE, {
  x: 0.3, y: 3.7, w: 0.08, h: 0.25, fill: { color: 'E31937' }
});
slide.addText('关键财务数据与估值', {
  x: 0.45, y: 3.7, w: 4.5, h: 0.3, fontSize: 14, bold: true, fontFace: 'Arial'
});

// 财务数据表
slide.addTable([
  [{ text: '指标', options: { bold: true, fill: '003366', color: 'FFFFFF' } },
   { text: 'FY24', options: { bold: true, fill: '003366', color: 'FFFFFF' } },
   { text: 'FY25E', options: { bold: true, fill: '003366', color: 'FFFFFF' } }],
  ['收入', '$51.4B', '$54.2B'],
  ['同比增长', '+6.0%', '+5.5%'],
  ['EBITDA', '$8.9B', '$9.5B'],
  ['EBITDA利润率', '17.3%', '17.5%'],
  ['EPS', '$3.42', '$3.75'],
  ['市值', '$185B', '—'],
  ['EV/EBITDA', '12.5x', '11.7x']
], {
  x: 0.45, y: 4.1, w: 4.3, h: 3.0,  // 标题下方,左下象限
  fontFace: 'Arial', fontSize: 10,
  border: { pt: 0.5, color: 'CCCCCC' },
  valign: 'middle',
  colW: [1.8, 1.25, 1.25]  // 列宽
});

错误: 纯文本如 注意:FY2024收入增长+1.0%,净利润$5.1B...错误: 无法正确转换为PowerPoint的HTML表格

对于预测,在结构化表格中使用悲观/基准/乐观情景。


质量检查清单

首页

所有幻灯片

注意: 有关PowerPoint文件创建,请参考PPTX技能