You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Excel数据批量邮件合并至多种PDF模板?

Excel VBA实现多PDF模板邮件合并

核心思路

通过Excel VBA调用Adobe Acrobat对象,逐行读取表格数据,根据Letter列的值匹配对应PDF模板,填充表单字段后,以Name列内容为文件名保存生成的PDF。

准备工作

  1. 确保安装Adobe Acrobat Pro(免费版Reader无法通过VBA操作表单)。
  2. 将三个PDF模板(命名为Grown.pdf、Child.pdf、Teen.pdf)放在同一文件夹,比如C:\PDF_Templates\。
  3. 确认每个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

配置与调试

  1. 路径修改:替换代码中TEMPLATE_FOLDER和SAVE_FOLDER为实际路径。
  2. 工作表名:将Sheet1改为你的数据所在工作表名称。
  3. 引用修复:若运行提示“用户定义类型未定义”,需添加Acrobat引用:
    • VBA编辑器中点击工具→引用
    • 勾选Adobe Acrobat xx.x Type Library(xx.x为安装版本号),确定即可。

注意事项

  • 确保PDF模板的表单字段名与代码中Name/Age/Gift完全匹配,包括大小写。
  • Grown模板无需包含Gift字段,代码已做判断避免报错。
  • 生成的PDF会自动保存在设置的保存文件夹,文件名对应每行的Name值。

内容的提问来源于stack exchange,提问作者at1981

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 17:45:32