在企业人力资源场景中,批量生成合同是最常见的文档处理需求之一,例如每月新员工入职、合同续签、劳务协议变更,往往一次就要处理几十甚至上百份合同。每份合同需要写入员工的姓名、岗位、薪资、合同期限等个性化信息。
对比传统SDK API处理
| 传统 Spire.Office for .NET API | Spire.Agent.Office | |
|---|---|---|
| 驱动方式 | 编写代码传统API处理:加载模板→获取字段→读取数据→逐行填充→保存,每步需代码控制 | 自然语言描述目标,AI 自动编排并完成全部处理步骤 |
| 代码量 | 需数行代码处理数据读取、字段映射、循环写入和格式控制 | 仅需配置代码 + 1 条自然语言指令 |
| 字段映射 | 硬编码指定合并字段与 Excel 列的对应关系,数据源变更需同步改代码 | AI 自动理解列名与模板字段的语义对应,数据源变更无需改代码 |
| 灵活性 | 模板字段变更需改代码 → 编译 → 重新部署 | 调整模板或数据源即可,已有指令可复用 |
| 维护性 | 依赖开发团队维护代码 | 模板和数据源可由业务人员直接维护 |
本文介绍如何使用 Spire.Agent.Office Word AI 能力通过邮件合并和占位符替换两种方式,将Excel员工数据自动写入 Word 模板,并批量输出PDF格式合同。您也可以自由选择保存为 DOCX、DOC、HTML ,OFD, Markdwon,XPS 等格式满足不同场景的归档需求。
有关产品安装和 SpireToken 配置,请参考 在 .NET 项目中集成 Spire.Agent.Office。以下示例默认已安装 Spire.Agent.Office 并完成 SpireToken 配置。
邮件合并方式
邮件合并是 Word 文档批量生成的标准方案,也是人力资源场景中最常用的模式。其核心思路是:根据合并字段的合同模板 Word 文档 + 数据源,让 AI 完成数据与模板的合并。
using Spire.Agent.Office.AI;
using Spire.Agent.Office.Extensions;
using Spire.Doc;
// 多个文档路径(数据源文件)
string[] attachmentPaths = new string[] { @"E:\data.xlsx" };
// Word模板文件路径
string inputPath = @"E:\template-mailmerge.docx";
// 结果文档路径(此处为null,将使用下面设置的输出文件夹路径)
string savePath = null ;
// 输出目录
string OutDir = @"E:\output";
// SpireToken Key
string key = "**************************";
// 自然语言指令
string instruction =
"执行邮件合并:将附件 ‘data.xlsx’中的员工数据逐条填充到合同模板的合并字段中;合并后保证同原文档布局样式;" +
"每位员工生成一份独立的合同文档,最终保存输出PDF格式";
// 调用Word文档处理函数
AIResult result = ExecuteDemoWord(instruction, inputPath, savePath, key, OutDir, attachmentPaths);
// 执行Word文档AI处理
static AIResult ExecuteDemoWord(string instruction, string inputPath, string savePath, string key, string output, string[] attachmentPaths)
{
// 创建AIOptions选项配置对象
AIOptions options = new AIOptions();
// 设置工作目录为输出目录
options.WorkDir = output;
// 设置SpireToken Key
options.SpireToken = key;
// 使用Document对象处理Word文档
using (Document doc = new Document())
{
// 从文件加载Word模板
if (!string.IsNullOrEmpty(inputPath) && File.Exists(inputPath))
{
doc.LoadFromFile(inputPath);
}
// 创建AI文档处理器
AIDocumentProcessor processor = doc.AI(options);
// 执行AI指令
return processor.ExecuteInstruction(doc, instruction, savePath, attachmentPaths);
}
}
原Word模板(包含邮件合并域)和Excel数据
邮件合并批量生成的PDF合同

生成的每份合同完整保留了模板的格式、表格样式和字体设置,所有合并字段均被替换为对应的员工数据。如果有 50 名新员工入职,只需一份模板 + 一份 Excel,一条指令即可完成全部合同生成。
占位符替换方式
占位符替换方式不需要在模板中预定义邮件合并字段,而是在文档中直接使用自定义的占位符标记(如 {{Name}}、{{Salary}}),由 AI智能体识别并替换。
// 多个文档路径(数据源文件)
string[] attachmentPaths = new string[] { @"E:\data.xlsx" };
// 合同模板文件路径
string inputPath = @"E:\template.docx";
// 保存路径(此处为null,将使用下面设置的输出文件夹路径)
string savePath = null;
// 输出目录
string OutDir = @"E:\output";
// SpireToken Key
string key = "**************************";
// 自然语言指令
string instruction =
"读取'data.xlsx' 中的员工数据,逐条替换合同模板中对应字段的占位符" +
"替换的字段内容高亮,替换后的结果保证同原文档布局样式,字体等," +
"每位员工生成一份独立的合同文档,最终保存输出PDF格式";
// 调用AI处理Word文档的方法,执行指令并返回处理结果
AIResult result = ExecuteDemoWord1(instruction, inputPath, savePath, key, OutDir, attachmentPaths);
// 执行Word文档AI处理
static AIResult ExecuteDemoWord(string instruction, string inputPath, string savePath, string key, string output, string[] attachmentPaths)
{
// 创建AIOptions选项配置对象
AIOptions options = new AIOptions();
// 设置工作目录为输出目录
options.WorkDir = output;
// 设置SpireToken Key
options.SpireToken = key;
// 使用Document对象处理Word文档
using (Document doc = new Document())
{
// 从文件加载Word模板
if (!string.IsNullOrEmpty(inputPath) && File.Exists(inputPath))
{
doc.LoadFromFile(inputPath);
}
// 创建AI文档处理器
AIDocumentProcessor processor = doc.AI(options);
// 执行AI指令
return processor.ExecuteInstruction(doc, instruction, savePath, attachmentPaths);
}
}
原Word模板(包含{{}}占位符)和Excel数据
占位符替换批量生成的PDF合同

两种方式对比
| 邮件合并方式 | 占位符替换方式 | |
|---|---|---|
| 模板制作 | 需插入邮件合并域字段 | 直接输入 {{}} 占位符 |
| 学习成本 | 需了解 Word 邮件合并功能 | 几乎零学习成本 |
| 灵活度 | 固定字段一一映射 | 支持替换中动态计算和格式化 |
| 数据源 | 需要结构化数据 | 支持结构化数据,也可在指令中定义 |
通过Spire.Agent.Office制作Word模板,请参考文章"使用 Spire.Agent.Office 生成各种Word模板"。
常见问题
生成的结果文档样式改变
原因:AI模型处理时,自动修改或添加了内容。
解决:在指令中添加"保证同原文档布局样式,字体等"的描述。
邮件合并后生成的文档数量与数据行数不一致
原因:数据源 Excel 中存在空行或合并单元格,导致读取行数不准确。
解决:确保数据源的首行为表头,后续每行对应一条员工记录,中间无空行。如果仍遇到此问题,可以在数据源中添加序号列用于校验:
获取SpireToken Key
- 联系 该Email地址已收到反垃圾邮件插件保护。要显示它您需要在浏览器中启用JavaScript。 或访问 https://www.e-iceblue.com/TemLicense.html 获得试用/商业 API 密钥
在代码中配置:
AIOptions options = new AIOptions();
options.SpireToken = key;







