关于 Presentation Maker
Presentation Maker 是一项使用 pptxgenjs 以程序方式制作 PowerPoint 演示文稿的技能,适合需要自动生成幻灯片的工作流。它涵盖主题布局、图表、媒体、表格和演讲者备注。
主要功能
- 01生成 PowerPoint 文件
- 02构建主题布局和母版幻灯片
- 03添加图表、表格、图片和形状
- 04加入演讲者备注
适用场景
- 01制作投资者路演演示文稿
- 02准备培训材料和报告
- 03用图表和表格呈现数据
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ jmsktm/ claude-settings --skill presentation-maker安装后在 Claude Code 中输入/presentation-maker确认已加载。
详细介绍
演示文稿制作工具
Presentation Maker 技能可自动创建专业的 PowerPoint 演示文稿(.pptx),并支持自定义布局、主题、图表、图像和多媒体。借助 pptxgenjs 等库,此技能可处理从简单幻灯片到包含数据可视化和动画的复杂演示文稿。
通过编程方式创建推介演示文稿、培训材料、报告、项目进展更新及各种演示内容。支持母版幻灯片、主题、图表、表格、图像、形状和演讲者备注,是一套完整的演示文稿自动化解决方案。
核心工作流
工作流 1:创建基础演示文稿
用途: 构建包含标题页和内容页的简单演示文稿
步骤:
- 导入
pptxgenjs并创建 Presentation 实例 - 定义演示文稿属性(标题、作者、公司)
- 添加带有公司品牌元素的标题页
- 添加包含项目符号的内容页
- 应用统一的主题和字体
- 添加幻灯片编号
- 导出为 .pptx 文件
实现:
const PptxGenJS = require('pptxgenjs');
function createBasicPresentation(content, outputPath) {
const pptx = new PptxGenJS();
// Set presentation properties
pptx.author = 'Company Name';
pptx.company = 'Company Name';
pptx.subject = content.subject;
pptx.title = content.title;
// Title slide
let slide = pptx.addSlide();
slide.background = { color: '2C3E50' };
slide.addText(content.title, {
x: 0.5,
y: 2.5,
w: '90%',
h: 1.5,
fontSize: 44,
bold: true,
color: 'FFFFFF',
align: 'center'
});
slide.addText(content.subtitle, {
x: 0.5,
y: 4.0,
w: '90%',
fontSize: 24,
color: 'BDC3C7',
align: 'center'
});
// Content slides
content.slides.forEach(slideData => {
let slide = pptx.addSlide();
// Title
slide.addText(slideData.title, {
x: 0.5,
y: 0.5,
w: '90%',
h: 0.75,
fontSize: 32,
bold: true,
color: '2C3E50'
});
// Bullet points
slide.addText(slideData.bullets, {
x: 0.5,
y: 1.5,
w: '90%',
h: 4.0,
fontSize: 18,
bullet: true,
color: '34495E'
});
// Slide number
slide.addText(`${pptx.getSlideNumber()}`, {
x: 9.0,
y: 7.0,
w: 0.5,
h: 0.3,
fontSize: 12,
color: '95A5A6',
align: 'right'
});
});
pptx.writeFile({ fileName: outputPath });
}
工作流 2:添加图表和数据可视化
用途: 创建包含嵌入式数据图表的幻灯片
步骤:
- 创建演示文稿
- 准备图表数据(标签和值)
- 添加带有标题的图表幻灯片
- 定义图表类型(柱形图、折线图、饼图、散点图等)
- 配置图表选项(颜色、图例、坐标轴)
- 添加数据标签并设置格式
- 在幻灯片上放置图表
实现:
function createPresentationWithCharts(data, outputPath) {
const pptx = new PptxGenJS();
// Bar chart slide
let slide = pptx.addSlide();
slide.addText('Quarterly Revenue', {
x: 0.5, y: 0.5, w: '90%', fontSize: 32, bold: true
});
const chartData = [
{
name: 'Revenue',
labels: data.quarters,
values: data.revenue
}
];
slide.addChart(pptx.ChartType.bar, chartData, {
x: 1.0,
y: 1.5,
w: 8.0,
h: 4.5,
chartColors: ['2E74B5'],
showTitle: false,
showLegend: true,
legendPos: 'b',
valAxisMaxVal: Math.max(...data.revenue) * 1.2,
dataLabelFormatCode: '$#,##0',
showValue: true
});
// Pie chart slide
slide = pptx.addSlide();
slide.addText('Market Share', {
x: 0.5, y: 0.5, w: '90%', fontSize: 32, bold: true
});
const pieData = [
{ name: 'Product A', labels: ['Share'], values: [35] },
{ name: 'Product B', labels: ['Share'], values: [28] },
{ name: 'Product C', labels: ['Share'], values: [22] },
{ name: 'Others', labels: ['Share'], values: [15] }
];
slide.addChart(pptx.ChartType.pie, pieData, {
x: 2.0,
y: 1.5,
w: 6.0,
h: 4.5,
showPercent: true,
chartColors: ['2E74B5', '5DA5DA', '60BD68', 'F17CB0']
});
// Line chart for trends
slide = pptx.addSlide();
slide.addText('Growth Trend', {
x: 0.5, y: 0.5, w: '90%', fontSize: 32, bold: true
});
const lineData = [
{
name: '2024',
labels: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun'],
values: [10, 15, 13, 18, 22, 25]
},
{
name: '2025',
labels: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun'],
values: [12, 18, 16, 22, 27, 32]
}
];
slide.addChart(pptx.ChartType.line, lineData, {
x: 1.0,
y: 1.5,
w: 8.0,
h: 4.5,
lineSmooth: true,
chartColors: ['2E74B5', 'E74C3C']
});
pptx.writeFile({ fileName: outputPath });
}
工作流 3:使用模板创建演示文稿
用途: 使用母版幻灯片模板,保持品牌风格一致
步骤:
- 加载或定义母版幻灯片布局
- 设置主题颜色和字体
- 定义幻灯片布局(标题、内容、双栏等)
- 使用预定义布局创建幻灯片
- 始终如一地应用公司品牌元素
- 为所有幻灯片添加页脚和徽标
- 应用模板后导出
实现:
function createFromTemplate(content, outputPath) {
const pptx = new PptxGenJS();
// Define theme colors
pptx.defineLayout({ name: 'CUSTOM', width: 10, height: 5.625 });
pptx.layout = 'CUSTOM';
// Define master slide
const masterSlide = pptx.defineSlideMaster({
title: 'MASTER_SLIDE',
background: { color: 'FFFFFF' },
objects: [
// Company logo
{ image: { x: 0.5, y: 0.2, w: 1.0, h: 0.4, path: 'company-logo.png' } },
// Footer
{ text: { text: 'Company Confidential', options: { x: 0.5, y: 5.0, fontSize: 10, color: '95A5A6' } } }
]
});
// Use master slide for content
content.slides.forEach(slideData => {
let slide = pptx.addSlide({ masterName: 'MASTER_SLIDE' });
slide.addText(slideData.title, {
x: 2.0, y: 0.5, w: 7.5, fontSize: 28, bold: true, color: '2C3E50'
});
slide.addText(slideData.content, {
x: 2.0, y: 1.5, w: 7.5, fontSize: 16, color: '34495E'
});
});
pptx.writeFile({ fileName: outputPath });
}
工作流 4:添加图像和媒体
用途: 添加图像、形状和多媒体内容
步骤:
- 创建演示文稿
- 添加带有说明文字的图像幻灯片
- 调整图像大小并设置位置
- 添加形状(矩形、圆形、箭头)
- 使用 z-index 对元素分层
- 为图像添加超链接
- 插入视频占位符(如果支持)
实现:
function createWithMedia(content, outputPath) {
const pptx = new PptxGenJS();
// Image slide
let slide = pptx.addSlide();
slide.addText(content.title, {
x: 0.5, y: 0.5, fontSize: 32, bold: true
});
// Add image
slide.addImage({
path: content.imagePath,
x: 1.5,
y: 1.5,
w: 7.0,
h: 4.0,
sizing: { type: 'contain', w: 7.0, h: 4.0 }
});
// Add caption
slide.addText(content.caption, {
x: 1.5,
y: 5.7,
w: 7.0,
fontSize: 14,
italic: true,
align: 'center',
color: '7F8C8D'
});
// Slide with shapes
slide = pptx.addSlide();
// Background shape
slide.addShape(pptx.ShapeType.rect, {
x: 0.5,
y: 1.5,
w: 9.0,
h: 4.5,
fill: { color: 'ECF0F1' },
line: { color: '3498DB', width: 2 }
});
// Arrow shapes for process flow
slide.addShape(pptx.ShapeType.rightArrow, {
x: 1.0,
y: 3.0,
w: 2.0,
h: 1.0,
fill: { color: '3498DB' }
});
slide.addText('Step 1', {
x: 1.3, y: 3.3, w: 1.4, fontSize: 16, color: 'FFFFFF', bold: true, align: 'center'
});
pptx.writeFile({ fileName: outputPath });
}
工作流 5:添加表格和数据
用途: 以表格形式展示结构化数据
步骤:
- 创建幻灯片
- 定义表格结构(行和列)
- 添加带样式的标题行
- 填充数据行
- 设置单元格格式(颜色、边框、对齐方式)
- 设置列宽
- 添加表格标题
实现:
function createWithTables(data, outputPath) {
const pptx = new PptxGenJS();
let slide = pptx.addSlide();
slide.addText('Project Status', {
x: 0.5, y: 0.5, fontSize: 32, bold: true
});
// Define table rows
const tableData = [
[
{ text: 'Task', options: { bold: true, fill: '2C3E50', color: 'FFFFFF' } },
{ text: 'Owner', options: { bold: true, fill: '2C3E50', color: 'FFFFFF' } },
{ text: 'Status', options: { bold: true, fill: '2C3E50', color: 'FFFFFF' } },
{ text: 'Due Date', options: { bold: true, fill: '2C3E50', color: 'FFFFFF' } }
]
];
// Add data rows
data.tasks.forEach(task => {
const statusColor = task.status === 'Complete' ? '27AE60' :
task.status === 'In Progress' ? 'F39C12' : 'E74C3C';
tableData.push([
{ text: task.name },
{ text: task.owner },
{ text: task.status, options: { fill: statusColor, color: 'FFFFFF' } },
{ text: task.dueDate }
]);
});
slide.addTable(tableData, {
x: 0.5,
y: 1.5,
w: 9.0,
colW: [3.0, 2.0, 2.0, 2.0],
border: { pt: 1, color: 'BDC3C7' },
fontSize: 14,
align: 'center',
valign: 'middle'
});
pptx.writeFile({ fileName: outputPath });
}
工作流 6:添加演讲者备注
用途: 为每张幻灯片添加演讲者备注
步骤:
- 创建包含内容的幻灯片
- 为每张幻灯片添加演讲者备注
- 使用关键谈话要点设置备注格式
- 添加时间安排建议
- 添加参考资料和来源
- 导出并包含备注
实现:
content.slides.forEach(slideData => {
let slide = pptx.addSlide();
slide.addText(slideData.title, {
x: 0.5, y: 0.5, fontSize: 32, bold: true
});
slide.addText(slideData.content, {
x: 0.5, y: 1.5, fontSize: 18, bullet: true
});
// Add speaker notes
slide.addNotes(`
Key Points:
- ${slideData.notes.keyPoints.join('\n - ')}
Timing: ${slideData.notes.timing}
Additional Context:
${slideData.notes.context}
`);
});
快速参考
| 操作 | 命令/触发语 |
|---|---|
| 创建演示文稿 | "create powerpoint with [slides]" |
| 添加图表幻灯片 | "add chart to presentation" |
| 插入图像 | "add image [file] to slide" |
| 创建表格 | "add table with [data]" |
| 使用模板 | "use template for presentation" |
| 添加形状 | "add shapes to slide" |
| 演讲者备注 | "add notes to slides" |
| 导出 | "save presentation as [name]" |
最佳实践
- 一致性: 使用模板和母版幻灯片,保持外观统一
- 简洁: 保持幻灯片清爽,尽量减少文字(6×6 规则:最多 6 个项目,每项最多 6 个词)
- 视觉元素: 使用图表和图片有效传达信息
- 配色方案: 采用与品牌相符的 2–3 种主色
- 字体大小: 正文至少为 18pt,标题至少为 28pt
- 对比度: 确保文字在背景上清晰易读
- 幻灯片数量: 演示每分钟安排一张幻灯片
- 数据可视化: 根据数据选择合适的图表类型
- 留白: 避免幻灯片过于拥挤;合理利用留白
- 动画: 谨慎使用,仅在能发挥作用时使用(pptxgenjs 不支持)
- 文件大小: 嵌入图片前先进行压缩
- 无障碍性: 尽可能为图片添加替代文本
常见模式
路演演示文稿:
const pitchSlides = [
{ type: 'title', title: 'Company Name', subtitle: 'Investor Pitch' },
{ type: 'content', title: 'Problem', bullets: ['Pain point 1', 'Pain point 2'] },
{ type: 'content', title: 'Solution', bullets: ['Our approach', 'Key benefits'] },
{ type: 'chart', title: 'Market Size', chartType: 'bar' },
{ type: 'content', title: 'Business Model', bullets: ['Revenue streams'] },
{ type: 'chart', title: 'Financial Projections', chartType: 'line' },
{ type: 'content', title: 'Team', image: 'team-photos.png' },
{ type: 'content', title: 'Ask', bullets: ['Funding amount', 'Use of funds'] }
];
培训演示文稿:
slides.forEach((slide, idx) => {
let s = pptx.addSlide();
s.addText(slide.title, { x: 0.5, y: 0.5, fontSize: 28, bold: true });
s.addText(slide.content, { x: 0.5, y: 1.5, fontSize: 16 });
if (slide.example) {
s.addText('Example:', { x: 0.5, y: 4.0, fontSize: 14, italic: true });
s.addText(slide.example, { x: 0.5, y: 4.4, fontSize: 14 });
}
s.addNotes(slide.trainerNotes);
});
依赖项
安装所需的软件包:
npm install pptxgenjs
替代库:
npm install officegen # Legacy option
npm install node-pptx # Another alternative
错误处理
- 文件路径: 添加到幻灯片前,确认图片路径有效
- 数据验证: 确保图表数据格式正确
- 内存: 对于包含大量高分辨率图片的演示文稿,监控内存使用情况
- 兼容性: 在 PowerPoint、Google Slides 和 Keynote 中测试输出结果
- 图表限制: 某些图表类型对数据点数量有限制
- 文本溢出: 监控文本长度,避免内容溢出幻灯片
性能技巧
- 添加到演示文稿前先压缩图片
- 同一张图片出现在多张幻灯片时,重复使用图片对象
- 批量执行幻灯片创建操作
- 使用适合网页的图片(屏幕显示使用 72–96 DPI 即可)
- 限制单个文件中的幻灯片数量(<100 张)
高级功能
自定义版式:
const layout = pptx.defineSlideMaster({
title: 'TWO_COLUMN',
background: { color: 'FFFFFF' },
objects: [
{ rect: { x: 0, y: 0, w: 5, h: 5.625, fill: 'F0F0F0' } },
{ rect: { x: 5, y: 0, w: 5, h: 5.625, fill: 'FFFFFF' } }
]
});
超链接:
slide.addText('Visit Website', {
x: 1, y: 3, fontSize: 18,
hyperlink: { url: 'https://example.com', tooltip: 'Click to visit' },
color: '0000FF',
underline: true
});
渐变:
slide.background = {
fill: { type: 'solid', color: '2C3E50' },
transparency: 0
};
评论
支持 Markdown