如何用Excel数据批量邮件合并至多种PDF模板?
Excel VBA实现多PDF模板邮件合并
核心思路
通过Excel VBA调用Adobe Acrobat对象,逐行读取表格数据,根据Letter列的值匹配对应PDF模板,填充表单字段后,以Name列内容为文件名保存生成的PDF。
准备工作
- 确保安装Adobe Acrobat Pro(免费版Reader无法通过VBA操作表单)。
- 将三个PDF模板(命名为
Grown.pdf、Child.pdf、Teen.pdf)放在同一文件夹,比如C:\PDF_Templates\。 - 确认每个PDF模板的表单字段名与Excel列名完全一致:
Name、Age、Gift(字段名大小写敏感)。
VBA代码实现
打开Excel按Alt+F11进入VBA编辑器,插入新模块,粘贴以下代码:
Sub BatchFillPDFTemplates() Dim acroApp As Acrobat.CAcroApp Dim acroDoc As Acrobat.CAcroPDDoc Dim jso As Object Dim ws As Worksheet Dim lastRow As Long Dim i As Long Dim templatePath As String Dim savePath As String Dim letterType As String Dim fileName As String ' 替换为你的模板文件夹和保存文件夹路径 Const TEMPLATE_FOLDER As String = "C:\PDF_Templates\" Const SAVE_FOLDER As String = "C:\Generated_PDFs\" ' 初始化Adobe Acrobat应用 Set acroApp = CreateObject("AcroExch.App") Set ws = ThisWorkbook.Worksheets("Sheet1") ' 替换为你的工作表名 lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row ' 自动创建保存文件夹(如果不存在) If Dir(SAVE_FOLDER, vbDirectory) = "" Then MkDir SAVE_FOLDER End If ' 循环处理每行数据(跳过表头,从第2行开始) For i = 2 To lastRow letterType = ws.Cells(i, "A").Value fileName = ws.Cells(i, "B").Value & ".pdf" ' 根据Letter类型匹配对应模板 Select Case letterType Case "Grown" templatePath = TEMPLATE_FOLDER & "Grown.pdf" Case "Child" templatePath = TEMPLATE_FOLDER & "Child.pdf" Case "Teen" templatePath = TEMPLATE_FOLDER & "Teen.pdf" Case Else MsgBox "第" & i & "行Letter类型无效,跳过处理", vbExclamation GoTo NextRow End Select ' 打开PDF模板 Set acroDoc = CreateObject("AcroExch.PDDoc") If Not acroDoc.Open(templatePath) Then MsgBox "无法打开模板:" & templatePath, vbCritical GoTo NextRow End If ' 获取表单操作对象 Set jso = acroDoc.GetJSObject() ' 填充基础字段 jso.getField("Name").Value = ws.Cells(i, "B").Value jso.getField("Age").Value = ws.Cells(i, "C").Value ' 仅Child/Teen模板填充Gift字段 If letterType <> "Grown" Then jso.getField("Gift").Value = ws.Cells(i, "D").Value End If ' 保存生成的PDF If Not acroDoc.Save(PDSaveFull, SAVE_FOLDER & fileName) Then MsgBox "保存失败:" & SAVE_FOLDER & fileName, vbCritical End If ' 关闭当前文档 acroDoc.Close Set acroDoc = Nothing NextRow: Next i ' 关闭Acrobat应用 acroApp.Exit Set acroApp = Nothing MsgBox "所有PDF生成完成!", vbInformation End Sub
配置与调试
- 路径修改:替换代码中
TEMPLATE_FOLDER和SAVE_FOLDER为实际路径。 - 工作表名:将
Sheet1改为你的数据所在工作表名称。 - 引用修复:若运行提示“用户定义类型未定义”,需添加Acrobat引用:
- VBA编辑器中点击
工具→引用 - 勾选
Adobe Acrobat xx.x Type Library(xx.x为安装版本号),确定即可。
- VBA编辑器中点击
注意事项
- 确保PDF模板的表单字段名与代码中
Name/Age/Gift完全匹配,包括大小写。 - Grown模板无需包含Gift字段,代码已做判断避免报错。
- 生成的PDF会自动保存在设置的保存文件夹,文件名对应每行的Name值。
内容的提问来源于stack exchange,提问作者at1981
相关产品推荐
相关产品推荐

