> ## Content Index
> Fetch the complete content index at: https://xavier.wang/llms.txt
> Use this file to discover other available public pages before exploring further.

# 巧用 Word 邮件合并，半自动生成活动照片记录文档
- URL: https://xavier.wang/151-emailmerge-to-document/
- Published: 2023-09-28T16:42:44.000Z
- Updated: 2023-09-28T17:16:53.000Z
- Description: 在去年尝试使用 Quicker 自动生成每周的健康情况统计表后，我便想寻找能够半自动或自动生成活动照片记录的方法，提高此类事务的处理效率。
- Author: 王虾虾
- Tags: 工具, 教育教学, 自动化

这个学期开始接触行政事务，现今的教学、德育、安全等工作都强调“事过留痕”的原则，各类活动都要求「精心策划、详细记录」—— 包括撰写方案、拍照、撰写方案、简报以及打印活动照片，每个星期少也有 3\~4 份活动照片记录，排版工作确实相当繁琐。

![使用 Quicker 生成每周的 “三表”](https://webcdn.2mb.xyz/blog/article/2023/09/EmailMerge-QuickerGenerate.jpg)

使用 Quicker 生成每周的 “三表”

在去年尝试使用 Quicker 自动生成每周的缺勤登记、体温异常及健康情况统计表后，我便想，寻找能够半自动或自动生成活动照片记录的方法，提高此类事务的处理效率。

## 💡 理清思路

活动照片记录文档主要由标题、照片及照片说明组成，可以在此基础上构建一个模板，进行重复套用。

![使用压缩软件打开 Docx 格式的 Word 文档](https://webcdn.2mb.xyz/blog/article/2023/09/EmailMerge-ZipStructure.jpg)

使用压缩软件打开 Docx 格式的 Word 文档

原先我的设想是，Docx 文件本质上是一个压缩包，通过直接替换压缩包中的图片，外加手动修改标题，便完成了活动照片记录。

不过这个想法很快就被上头“一拍大腿”的格式标准给打破了 —— 每张照片下，都必须用文字说明时间、地点、主题、主办单位。

少数派作者群的群友给出了不少的建议，比如利用 `python-docx` 库，以及邮件合并的方法。而 Power Automate 涉及到 Excel 与 Word 的自动化流需要订阅高级版方可使用。因为不会 Python 和 VBA，我最终选择了大学计算机基础学过的 Word 邮件合并，Word 的事还是交给 Word 来解决（

> 注：下文步骤将创建两个文件 —— `信息模板.xlsx`、`邮件合并模板.docx`，并使用 `F:\工作文件\照片收集\` 作为活动照片存放的文件夹，请根据实际情况进行更改。

## 🎬 视频教程

- 🎬 视频观看链接：[Bilibili](https://www.bilibili.com/video/av619050493) / [YouTube](https://www.youtube.com/watch?v=0orxxROK1Xo)

## 📋 准备工作

### 创建信息模板

Word 邮件合并可以将数据源的信息，套用在一个相同格式的模板，适合生成大量个性化文档的场景。

第一步，我先在 Excel 中制作了活动照片记录需要的信息字段模板，比如`活动主题`、`活动日期`及`活动照片存放文件夹`，通过这些基础信息，利用公式生成其余的固定信息。

Excel 工作簿分为两个工作表 —— `键入数据`、`生成列表`，前者用于输入相关信息，后者生成后提供给 Word 引用。需要注意，因为 Word 中的 `IncludePicture` 域会处理反斜杠 `\`，因此文件夹和照片文件的单反斜杠 `\` 需要替换为双反斜杠 `\\`。

`照片文件夹`、`照片路径` 两列的数据可以通过公式自动处理，如 `="F:\\工作文件\\照片收集\\"&B2` 生成文件夹路径、`=E2&"\\1.jpg"` 生成照片文件路径（照片按照 `1.jpg`、`2.jpg`、`3.jpg` …… 格式进行重命名）。

![键入数据表格内容](https://webcdn.2mb.xyz/blog/article/2023/09/EmailMerge-Gif-Excel-DataGenerateSheet.gif)

键入数据表格内容

![生成列表表格内容](https://webcdn.2mb.xyz/blog/article/2023/09/EmailMerge-Gif-Excel-DataInputSheet.gif)

生成列表表格内容

完成编辑后，保存 `信息模板.xlsx` 表格。

### 制作 Word 模板

第二步，按照文件格式要求，制作活动照片记录的模板。这一步可以直接套用先前制作的文档。

![创建活动照片记录文档的基础模板](https://webcdn.2mb.xyz/blog/article/2023/09/EmailMerge-BasicTemplate.jpg)

创建活动照片记录文档的基础模板

## 🔗 进行邮件合并

第三步，进行邮件合并。在 Word 中切换至`邮件`选项卡，进入`邮件合并分步向导`，数据来源使用刚才创建的信息字段模板。接下来，我们需要在文档中需要填写信息的地方，插入合并域。

![邮件合并分步向导操作过程](https://webcdn.2mb.xyz/blog/article/2023/09/EmailMerge-Gif-Word-EmailMerge.gif)

邮件合并分步向导操作过程

当你在这一步点击生成时，恭喜你得到了一份没有照片且不符要求的活动记录，实现自动插入照片以及满足一页两张照片的要求，还需要使用多一点点域代码。

![错误格式](https://webcdn.2mb.xyz/blog/article/2023/09/EmailMerge-Word-FirstMerge-Error.jpg)

错误格式

### 域代码

Word 域代码可以看成是动态更新的内容，用于在文档中插入自动化的内容、功能或数据，例如页码、日期和时间、邮件合并、文档属性、交叉引用、图序等。在这里我们需要用到 `IncludePicture` 域、`Next 字段`。

IncludePicture 域可以在文中插入指定路径的图片。在`插入`选项卡中，找到`文档部件 - 域 - IncludePicture`，文件名填写“路径”二字，点击确定插入到文档的指定位置。

因为还没有填写图片的文件路径，图片此时是无法加载的。按下 `Alt + F9` 快捷键，显示当前文档的域代码，将 `IncludePicture` 域中的“路径”二字替换为照片路径域。

![在  域中插入照片路径域](https://webcdn.2mb.xyz/blog/article/2023/09/EmailMerge-Gif-Word-IncludePicture.gif)

在 `IncludePicture` 域中插入照片路径域

默认情况下，Word 会按页为单位生成新的文档，实现同一文档插入多条数据记录，我们需要使用到 `Next Record 域`。

使用方法很简单，在`邮件`选项卡中，找到`规则 - 下一记录`，插入至图片说明的末尾。接着将图片以及图片说明复制、粘贴、复制、粘贴。

![插入  域](https://webcdn.2mb.xyz/blog/article/2023/09/EmailMerge-Gif-Word-NextRecord.gif)

插入 `Next Record` 域

### 生成文档

完成以上步骤后，你就得到了一份活动照片记录的模板。在 `邮件` 选项卡中，点击 `完成并合并 - 编辑单个文档`，生成后，选择全部内容 `Ctrl + A`，更新域内容 `F9`，此时生成的文档图片便会自动更新为文件夹的照片。

![邮件合并生成文档效果](https://webcdn.2mb.xyz/blog/article/2023/09/EmailMerge-Gif-Word-Generate.gif)

邮件合并生成文档效果

## ✅ 进阶玩法

> 注：以下的 VBA 宏代码均由 ChatGPT 生成，本人负责组合、拼接与搬运。

除了手动完成邮件合并，利用 VBA 宏与快捷键，也能减少生成文档需要的步骤。

首先，分别将 `信息模板.xlsx` 与 `邮件合并模板.docx` 分别另存为 `信息模板.xlsm`（启用宏的表格）、`邮件合并模板.docm`（启用宏的文档），Word 与 Excel 需要开启宏，并将文档所在目录设为 `受信任目录` （`Word 选项 - 信任中心 - 信任中心设置 - 受信任位置`）。

随后打开 `信息模板.xlsm`，按 `Alt + F11` 进入 VBA 编辑器，点击 `插入 - 模块`，在编辑框中插入以下代码，编辑完成后按 `Ctrl + S` 保存，关闭 VBA 编辑器。

```
Sub 进入邮件合并()
    Dim objWord As Object
    
    ' 创建一个 Word 应用程序对象
    Set objWord = CreateObject("Word.Application")
    
    ' 打开 Word 文档（替换为你的 Word 文档的路径）
    objWord.Documents.Open "F:\工作文件\邮件合并模板.docm"
    
    ' 让 Word 应用程序可见
    objWord.Visible = True
    
    ' 保存当前工作簿
    ThisWorkbook.Save
    
    ' 退出 Excel
    Application.Quit
End Sub

```

Excel 切换到 `开发工具` 选项卡，点击 `插入 - 按钮（窗体控件）`，在工作表上画出一个按钮，绘制好后右击按钮，点击 `指定宏`，选择刚才创建的 `进入邮件合并`。点击按钮后，便会自动打开邮件合并模板，并且关闭 Excel 程序。

![Excel 中创建进入文档并关闭 Excel 的宏](https://webcdn.2mb.xyz/blog/article/2023/09/EmailMerge-Excel-VBA-EnterWord.jpg)

Excel 中创建进入文档并关闭 Excel 的宏

接着，打开 `邮件合并模板.docm`，按 `Alt + F11` 进入 VBA 编辑器，点击 `插入 - 模块`，在编辑框中插入以下代码，编辑完成后按 `Ctrl + S` 保存，关闭 VBA 编辑器。

```
Sub 执行邮件合并()
    ' 执行邮件合并
    ActiveDocument.MailMerge.Execute
    
    ' 如果需要，可以在这里添加其他后续操作
End Sub

```

Word 无法像 Excel 一样指定宏到一个按钮上，但可以通过快捷键运行宏。在 `邮件` 选项卡中右击鼠标，选择 `自定义功能区`。进入到 Word 选项，点击 `键盘快捷方式：自定义`，`将更改保存在文档` 选择 `邮件合并模板.docm`，然后在 `类别` 中找到 `宏`，选择 `执行邮件合并`，添加一个快捷键组合，我这里分配的是 `Alt + Shift + N`，分配好后点击 `指定`。

![Word 中分配快捷键给宏](https://webcdn.2mb.xyz/blog/article/2023/09/EmailMerge-Word-ShortcutSetting.jpg)

Word 中分配快捷键给宏

## 💭 尾言

除了以上方式，你也可以利用其它的工具来实现，比如 Power Automate、python-docx 库、Quicker 等方式，巧妙运用一些自动化工具，可以帮助你高效完成重复性的工作任务，早日实现应摸🐟尽摸🐟。