用 C# 通过 AI 将多份文档智能转为 PowerPoint 演示文稿

使用 C# 和 AI 将文档转为 PowerPoint 演示文稿:Word、PDF、Excel 文件通过一条自然语言指令汇成一份演示文稿

使用 C# 和 AI 将文档转为 PowerPoint 演示文稿,并不只是格式转换。一份 30 页的报告变成 10 页幻灯片,中间是有人读完了全文、判断哪 90% 可以舍弃、把剩下的内容重新组织成一条叙事线,再补上视觉设计。这属于编辑层面的综合,传统 PowerPoint 库做不了。

真正值得琢磨的是综合了什么。真实业务里,来源很少是单一文件:一份季度业务复盘要同时用到 Excel 工作簿里的数字、Word 报告里的叙述,以及 PDF 发票里的那张签字件。AI 文档 Agent 的价值不在”把一个 .docx 转成 .pptx“,而在”把这三份都读一遍,给我一份能串起它们的演示文稿”。本文用 Spire.Agent.Office 在 C# 里演示最直接的做法:把全部文档作为附件、配一条自然语言指令,一次调用生成演示文稿。

快速导航


1. 一条指令,多种来源

传统的 Spire.Office 代码把每种格式当成一座孤岛。要用一份 Word 报告加一张 Excel 表格做演示文稿,你得:

  1. Spire.Doc 打开 .docx,挑出想要的文字。
  2. Spire.XLS 读取工作簿、算出数字。
  3. 来源是 PDF 时再上 Spire.Pdf
  4. Spire.Presentation 逐页建幻灯片、摆放每个文本框和图表、手动算版式。

四套 API、每种格式一套解析器,外加一个手写版式引擎。文档结构一变,代码就崩。

Spire.Agent.Office 把这一整套压成一条指令。你把所有来源文件交给 Agent,告诉它这份演示文稿要讲什么故事。Agent 逐份读懂格式、判断跨文档的重点、直接产出幻灯片,没有一行手写版式代码。

心智模型只有一步:

多种文档类型汇入同一个 AI Agent,输出为一份 PowerPoint 演示文稿

不用为每种格式写解析器,让 Agent 读遍所有文件、直接生成演示文稿即可。一次调用、一条指令、一个 .pptx 文件。

2. 你需要准备什么

  • .NET 6+(示例面向 net10.0)。
  • `Spire.Agent.Office` NuGet 包。它会传递依赖带出 Spire.DocSpire.PdfSpire.XLSSpire.Presentation,无需单独安装。
  • 一个 SpireToken(Spire.Agent.Office 的 API Key)。Agent 需要访问 AI 服务,所以真正生成时必须填有效 Token。
  • 命名空间引用:
1
2
3
using Spire.Agent.Office.AI;        // AIOptions、AIDocumentProcessor、AIResult
using Spire.Agent.Office.Extensions;// presentation.AI(...) 扩展方法
using Spire.Presentation; // Presentation

3. 极简方案:一次调用,一份演示文稿

核心思路简单到极致:把所有来源文档作为附件传进去,写一句自然语言指令,让 Agent 在一次 ExecuteInstruction 调用里完成阅读、理解、综合和排版。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
string[] sources = new[]
{
Path.Combine(sampleDir, "AI-Powered Document Processing Report.docx"),
Path.Combine(sampleDir, "purchase-orders.xlsx"),
Path.Combine(sampleDir, "invoice_INV-2026-0815.pdf")
};

string instruction =
"根据提供的文档生成一份简洁的季度业务复盘演示文稿。" +
"1. 使用干净的蓝色主题;" +
"2. 总结业务复盘、项目状态、客户试点调研和平台表现;" +
"3. 每页只聚焦一个关键发现或指标;" +
"4. 生成 5 页。";

AIResult result = processor.ExecuteInstruction(
ppt, instruction, savePath, sources,
autonomousOutput: true, maxTurns: null);

整个方案就是:一次方法调用、一条指令字符串。没有按格式写的解析器、没有中间文件、没有手写版式代码。Agent 读懂每种格式、判断跨文档的重点,直接把演示文稿写到 savePath

真正让这件事跑起来的是 autonomousOutput: true:它告诉 Agent 可以自行写文件(包括最终的 .pptx),不必每步都来问确认。maxTurnsnull(或一个较大的数),给 Agent 留够执行步数。

4. 实战示例:Word + PDF + Excel 合成一份演示文稿

下面是完整程序。指向一个文件或一个目录,它就会在一次 AI 调用里生成演示文稿:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
using System;
using System.IO;
using System.Linq;
using Spire.Agent.Office.AI;
using Spire.Agent.Office.Extensions;
using Spire.Presentation;

class Program
{
static void Main()
{
string instruction =
"根据提供的文档生成一份简洁的季度业务复盘演示文稿。" +
"1. 使用干净的蓝色主题;" +
"2. 总结业务复盘、项目状态、客户试点调研和平台表现;" +
"3. 每页只聚焦一个关键发现或指标;" +
"4. 生成 5 页。";

AIOptions options = new AIOptions { SpireToken = "sk-YourSpireToken", TimeoutMs = 1000000 };

using (Presentation ppt = new Presentation())
{
AIResult result = ppt.AI(options).ExecuteInstruction(
ppt, instruction, @"C:\Samples\Q3_Review.pptx", ResolveInputs(@"C:\Samples"),
autonomousOutput: true, maxTurns: null);

Console.WriteLine(result.Success ? "Success" : $"Error={result.ErrorMessage}");
}
}

// 指向文件或目录;传目录时按受支持的格式筛选
static string[] ResolveInputs(string path) =>
File.Exists(path) ? new[] { path }
: Directory.GetFiles(path).Where(IsSupported).OrderBy(f => f).ToArray();

static bool IsSupported(string file) =>
new[] { ".doc", ".docx", ".xls", ".xlsx", ".ppt", ".pptx", ".pdf", ".txt", ".md" }
.Contains(Path.GetExtension(file).ToLowerInvariant());
}

整个程序就这些。除了 Agent 调用本身,剩下的唯一代码是 ResolveInputs,它只负责决定把哪些文件作为附件,既不读取也不解析文档内容。指令里唯一描述”设计”的是主题、页数和重点;阅读、取舍、排版都交给 Agent。

一次调用,五页幻灯片。上面这段程序生成的结果:

生成的 5 页季度业务复盘演示文稿,内容来自 Word 报告、Excel 工作簿和 PDF 发票

5. 底层原理

  • AIDocumentProcessor 通过 ppt.AI(options)Presentation 取得。Presentation 就是 Agent 绘制幻灯片的画布。
  • AIOptions 承载配置:SpireToken(你的 Key)与 TimeoutMs(真实文档要调大,大文档的 AI 分析很耗时)。
  • ExecuteInstruction 驱动 Agent。传入 Presentation、自然语言 instruction、输出 .pptxsavePath,以及 string[] 来源文件路径(Word、PDF、Excel、Markdown 任意混搭)。autonomousOutput: true 表示 Agent 可以自行写文件,包括最终的演示文稿,不必每步确认。它返回 AIResult,含 SuccessErrorMessageOutputFiles(Agent 创建的全部文件)。
  • maxTurns 控制 Agent 允许的步数。传 null 表示不限,也可以给一个大数(例如 80)应对文档较多的情况。
  • GeneratePresentation(sourcePath, instruction, savePath) 是只有一份来源文档时的专用快捷方法,返回 PPTGenerationResultSuccessGeneratedPagesTotalPagesOutputPathErrorMessage),而不是 AIResult。它的 sourcePath 只接受单个文件,这正是本文采用多附件 ExecuteInstruction 路径的原因:只有这条路能让一份演示文稿在单次调用里取材于多份来源。

为什么不先合并成 Markdown? 可以,见第 6 节变体 B。但多数场景下,单次调用更简单、更快,结果一样。中间那份 Markdown 只在你想在花 Token 生成演示文稿之前先检查、编辑合并内容时才有用。

6. 精确控制

上面的做法刻意保持极简。需要更多掌控时,下面这些变体都建立在同一次 ExecuteInstruction 调用之上。

调指令。 演示文稿的结构、页数、主题、图表,全部由指令字符串决定。写明确一些:

1
2
3
// 例如指定页数、主题色,以及某一页放一张图表
"做一份 12 页演示文稿。浅色极简风,强调色 #2E5AAC。" +
"第 5 页用柱状图展示月度营收。每页只讲一个核心信息。";

变体 A:自己逐份摘要(更可控)。 如果你更愿意给每份文档单独下指令,而不是信任一条跨文档指令,可以循环 SummarizeDocument,它把单个文件的 Agent 摘要以 string 返回:

1
2
3
4
var sb = new StringBuilder();
foreach (var file in sources)
sb.AppendLine($"## {Path.GetFileName(file)}\n\n{processor.SummarizeDocument(file)}");
File.WriteAllText(Path.Combine(workDir, "consolidated.md"), sb.ToString());

然后把这份合并 Markdown 作为唯一来源传给 ExecuteInstruction。这样你能拿到逐份文档的摘要,生成前就可以阅读和修改。

变体 B:先合并成 Markdown,再生成(两步)。 需要一份可检查的中间文件时,把工作拆成两次调用。第 1 步用 ExecuteInstruction 的自主模式把所有来源合并成一个 Markdown 文件;第 2 步把这份 Markdown 交给 ExecuteInstruction 生成演示文稿:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// 第 1 步:把所有文档合并成一个 Markdown 文件
string consolidateInstruction =
"读取所有附件,把内容合并成一个名为 'output_consolidated.md' 的 Markdown 文件。" +
"每个来源用一级标题分隔,保留关键事实、数据和表格,去掉套话。只输出这一个文件。";
processor.ExecuteInstruction(ppt, consolidateInstruction,
Path.Combine(workDir, "output_consolidated.pptx"), sources,
autonomousOutput: true, maxTurns: 40);

string consolidatedMd = Path.Combine(workDir, "output_consolidated.md");

// 第 2 步:基于这份合并 Markdown 生成演示文稿
string genInstruction =
"基于这份合并素材,做一份 9 页的季度业务复盘演示文稿。" +
"专业商务蓝、层级清晰、每页配演讲者备注。";
processor.ExecuteInstruction(ppt, genInstruction,
Path.Combine(workDir, "QBR_Deck.pptx"), new[] { consolidatedMd },
autonomousOutput: true, maxTurns: 40);

取舍:变体 B 多出一份可检查的中间 Markdown,调试、或者需要人工复核合并内容时很有用。第 3 节的单次调用是推荐默认,因为更简单也更快。

延伸推荐:在 .NET 中用 AI 智能体自动化发票处理,同样是“把一批文档交给智能体、直接拿回成品文件”的生成工作流。

7. 读回并校验结果

生成之后,重新打开演示文稿,在程序里校验:

1
2
3
4
5
6
7
8
9
10
11
12
using (Presentation deck = new Presentation())
{
deck.LoadFromFile(savePath);
Console.WriteLine($"幻灯片总数:{deck.Slides.Count}");

for (int i = 0; i < deck.Slides.Count; i++)
{
ISlide slide = deck.Slides[i];
string title = slide.Title ?? "(无标题)";
Console.WriteLine($"第 {i + 1} 页:{title}");
}
}

这里也是人工复核的落点:加载生成好的演示文稿、检查标题,发现不对就回头精炼指令。

8. 常见问题

生成的页数不对。
来源文档较大时,分析可能超过默认超时,Agent 提前停下。把 AIOptions.TimeoutMs 调大(例如 1000000,约 17 分钟),并在指令里写明页数区间,例如”最终演示文稿控制在 8 到 12 页”。

Agent 漏掉了某份文档的内容。
复杂文档可能让单次处理跑偏。在指令里点名要的内容(”包含 Word 报告里的发现””保留 Excel 表格”)。如果仍然不准,改用第 6 节的变体 B,先检查合并出来的 Markdown 再生成。

调用报 “401 Invalid token”。
SpireToken 被拒。确认它有效、未过期,并且正确填进了 AIOptions.SpireToken

多份文档怎么一起传?
ExecuteInstruction 的第四个参数接受 string[] 文件路径。把每份来源都传进去,.docx.pdf.xlsx.md 等任意混搭,Agent 会在一次调用里全部读完。只有一份来源时,专用快捷方法是 GeneratePresentation(sourcePath, instruction, savePath);上面这种多附件写法才是让一份演示文稿取材于多份来源的方式。

获取你的 SpireToken Key
联系我们获取试用或商业 API Key,也可以申请临时 License。在代码里这样配置:

1
2
3
AIOptions options = new AIOptions();
options.SpireToken = "sk-YourSpireToken";
options.TimeoutMs = 1000000;

延伸阅读