Word 自动化:批量生成文书
Excel 管数据,Word 管文档。真实工作里最经典的场景是"一张模板 × 一千条数据"。
学习目标
- 用"打开文档 → 读/写 → 保存/另存为 → 关闭"四步操作 Word
- 说清"文档对象"是什么,以及它和 Excel 的"工作簿对象"为什么是一回事
- 理解 Word 的"焦点"是什么,为什么它决定了你能改哪里
- 用"标记 + 查找文本后设置光标位置 + 写入文字"精准填充模板
- 把 Excel 的一列数据逐行灌进 Word,批量生成一批文档
预计用时:读课 35 分钟 + 上机 40 分钟 | 前置知识:第 6 课(变量、字典、循环)、第 7 课(Excel 四步与二维数组) | 本课性质:软件自动化操作课,概念不多但要动手练手感,认证会考"焦点""读取限制""标记法"
知识地图
第 7 课我们用 Excel 处理"数据",本课用 Word 处理"文档"。两课是同一套骨架换了一类软件——学会一个,另一个几乎能自己推出来。第 9 课的邮件自动化会继续复用"读数据 → 填内容 → 发出去"这条主线。
$姓名$ 标记的模板和一张 Excel 数据表,你能写出循环批量生成文档的流程。一、Word 也走同样四步
回忆第 7 课:操作 Excel 是"打开工作簿 → 读/写单元格 → 保存 → 关闭"。操作 Word 结构完全一致, 只是把"工作簿对象"换成文档对象,把"单元格"换成"焦点": [1]
| 步骤 | 命令 | 关键属性 |
|---|---|---|
| 打开 | 打开文档 | 文件路径、访问时密码、编辑时密码、是否可见、输出到(文档对象) |
| 整篇读 | 读取文档 | 文档对象、输出到 |
| 整篇写 | 重写文档 | 用新内容覆盖整篇 |
| 保存 | 保存文档 / 文档另存为 | 另存为可换路径和文件名 |
| 关闭 | 关闭文档 | 文档对象 |
还有 获取文档路径 等辅助命令。文件支持 .doc / .docx。
1.1 四步连起来是什么样
把上面的表按时间顺序走一遍,就是机器人操作一份 Word 的完整生命周期:
- 打开(拿到"遥控器"):
打开文档会返回一个文档对象,必须把它"输出到"某个变量,比如objDoc。之后所有命令都靠这个变量找到"要操作哪一份文档"。
预期结果:若"是否可见"填 True,屏幕上会弹出 Word 窗口;填 False 则在后台悄悄打开。 - 读或写(做事):读整篇用
读取文档;整体覆盖用重写文档;局部插入/替换则要先定位焦点,再用写入文字等命令。 - 保存(落盘):想覆盖原文件用
保存文档;想留一份新文件用文档另存为(可改路径和文件名)。不保存就关闭,改动会丢。 - 关闭(放开遥控器):
关闭文档。循环批量生成时,每轮结束都要关掉,否则 Word 里会开着一堆文档,越跑越慢甚至报错。
为什么每步都要"输出到"变量?机器人不像人那样"看着屏幕知道现在开的是哪个文件"。它只知道你给它的那个变量。所以"输出到"就是把"这份文档的身份证"存起来——没有它,后面的命令找不到操作对象,就像拿着遥控器却不知道对应哪台电视。
1.2 文档对象:Word 版的"工作簿对象"
文档对象是 APA Creator 对"一份已打开的 Word 文档"的指代。类比第 7 课:Excel 里叫工作簿对象,Word 里叫文档对象,作用一模一样——让命令知道该操作哪一份文件。 你可以在一个流程里同时打开好几份文档,每份存进不同变量,互不干扰。
限制要知道(高频考点):读取文档 会把全文文字读出来,但暂不支持读取文字格式、表格状态和图片。[1]
易错点:不要以为 读取文档 会把"标题是红色、正文有表格、插了一张图"这些信息也读回来。它读回来的只是一串纯文字。如果你的需求是"检查表格里的数字",那要换思路(例如改用 Excel 处理,或先在 Word 里把表格转成文本)。
二、焦点:Word 里"你正指着哪儿"
Excel 定位靠"单元格",一格一格很明确;Word 没有格子,靠焦点——当前选中的区域(高亮)或光标位置。 Word 的编辑操作大多针对焦点进行:想改一段字,得先选中它;想插入内容,得先把光标移过去。[1] 换句话说,焦点就是机器人的"笔尖",笔尖落在哪,写的东西就落在哪。
| 命令 | 作用 | 注意 |
|---|---|---|
设置光标位置 | 按"移动次数 + 移动方式(字符/行/段落)"移光标 | 移动次数不能为负,只能向右/下移 |
选择行 | 选中从"起始行"到"结束行" | 行号按文档计算 |
查找文本后设置光标位置 | 找到指定文字,把焦点放到那里 | 相对位置可选"选中文本" |
2.1 三个焦点命令各自怎么用
- 设置光标位置:适合"从当前位置往前挪几格"。在属性区选移动方式(字符 / 行 / 段落)+ 填移动次数。
易错:移动次数只能是非负数;想"往回退"是做不到的,只能重新定位。 - 选择行:填起始行和结束行,把这一整段选中。
易错:行号是机器人按它对文档的理解数出来的,不一定是你在屏幕上数的那一行(见 2.2)。 - 查找文本后设置光标位置:填要查找的文本,把相对位置设为"选中文本",焦点就落在这段文字上并高亮。
用途:这是标记填充法的核心一步,最稳。
2.2 为什么不靠"第几行第几个字"
你可能会想:文档结构固定,那我直接算"第 3 行第 10 个字"不就行了?问题在于——Word 文档里藏着大量 看不见的格式标记(段落标记、换行、制表位等)。你屏幕上看是"一行",机器人内部可能数出好几种字符; 今天多一个空格、明天改一次字体,行号就偏了。焦点一旦偏掉,后面写的内容就会插错地方,而且很难排查。
官方提醒:单靠"设置光标位置/选择行"实际效果不好——Word 里有大量看不见的格式标记,会让"字符数/行数"算不准,导致焦点偏掉。[1]
易错点(焦点偏移):流程"时好时坏"、内容偶尔插错位置,九成是焦点没对上。排查顺序:先确认定位用的是标记法而不是行号;再打印出文档内容,确认标记文字和查找文字一字不差(大小写、全半角、空格都要一样)。
三、官方推荐的精准填充法:用标记
这是本节最值钱的技巧,直接对应"批量生成文书":
$Name$
→
查找文本后设置光标位置(选中标记)
→
写入文字(替换成真实内容)
在模板里需要填的地方预先写上 $Name$、$Date$ 这类标记,机器人按标记去找、选中、替换。因为不依赖"第几行第几个字",就不会被隐藏格式干扰。[1]
为什么用标记,而不是靠行号?标记是"路标",行号是"距离"。距离会因为你换了字体、多敲了空格、系统不同而变;路标不会——不管文档怎么排版,$姓名$ 这串文字总在它该在的地方。用标记定位,等于把"脆弱的位置计算"换成"稳定的文字匹配"。这也是为什么官方把它列为推荐做法:它对排版变化免疫。
3.1 标记填充法的标准步骤
- 做模板:在 Word 里写好固定文案,把需要变的地方挖成坑,例如"尊敬的
$姓名$,您本月绩效为$分数$。"。 - 打开:
打开文档,路径指向模板,是否可见可先设 True 方便观察。 - 定位:
查找文本后设置光标位置,查找文本填$姓名$,相对位置选"选中文本"。 - 替换:
写入文字,内容填真实值(如"张三")。因为是"选中文本"状态,新文字会替换掉标记。 - 重复:对
$分数$再做一次 3、4 步。 - 另存并关闭:
文档另存为到目标路径,再关闭文档。打开生成的文件核对。
易错点(标记不一致):模板里写的是 $姓名$,命令里却写成 $名字$、少了后一个 $、或用了中文全角括号——查找失败,后面的"写入文字"就会写到错误的焦点上。建议全程复制粘贴标记,别手打。
小技巧:标记成对出现(前后都有 $)更容易一眼看出边界,也降低"部分匹配"的概率。模板定稿后,先手动在 Word 里搜一次每个标记,确认都能搜到,再交给机器人。
四、把 Excel 和 Word 串起来
真实场景往往是:数据在 Excel,模板在 Word,逐行生成一批文档。
打开Excel → 读取区域,得到二维数组 rows
For Each 一行 In rows
打开文档(模板.docx)
查找文本后设置光标位置("$姓名$", 选中文本)
写入文字(一行[0])
查找文本后设置光标位置("$部门$", 选中文本)
写入文字(一行[1])
文档另存为(输出目录 & 一行[0] & ".docx")
关闭文档
Next
关闭Excel工作簿
循环体里每次打开的都是同一份模板,但每次另存成不同文件名——就得到了一叠文档。
串起来的关键:Excel 负责"第几行是谁、值是多少"(第 7 课的二维数组),Word 负责"把值填进文档",For Each 负责"一条数据做一轮"。三者各司其职,模板本身只做一次。
易错点(两份文件都要收尾):批量生成时最容易漏的是收尾——循环里每轮要关闭文档,循环外要关闭 Excel 工作簿。否则进程会越堆越多。另外,另存的文件名来自数据列,若数据里有 \ / : * ? " < > | 这类非法字符,保存会失败,记得先清洗。
命令属性细节见 参考页:Word 命令速查。
本课小结
必记要点
- Word 操作四步:打开文档 → 读/写 → 保存/另存为 → 关闭文档;打开时输出到文档对象,后续命令全靠它。
读取文档只读文字,暂不支持读取文字格式、表格状态和图片。- 焦点=当前选中区域或光标位置;Word 的编辑操作大多针对焦点进行,焦点错了就写错地方。
- 定位三命令:
设置光标位置(次数不可为负)、选择行、查找文本后设置光标位置。 - 官方推荐标记填充法:模板埋
$Name$→ 查找并选中 → 写入文字。用"路标"代替"距离",避开隐藏格式导致的偏位。 - 批量生成 = Excel 数据(二维数组)+ Word 模板 +
For Each循环 + 每轮另存为不同文件名。
自测
不看上面,凭记忆作答。答错不要紧,解析会告诉你为什么。
上机实践(回到 Windows)
准备:在 res 目录建一个 模板.docx,正文写上"尊敬的 $姓名$,您本月绩效为 $分数$。"(注意 $ 要用英文半角,前后成对)。
任务 A(能读):用 打开文档 打开模板(是否可见 True),再 读取文档 输出全文,确认你能读出来。
任务 B(能定位):用 查找文本后设置光标位置 找到 $姓名$(相对位置选"选中文本"),再用 写入文字 把它替换成"张三"。
任务 C(能生成):同样处理 $分数$,换成 95,然后 文档另存为 到 res\张三.docx,关闭文档。打开生成的文件核对。
任务 D(进阶,选做):把任务 B/C 放进 For Each,用 Excel 里两行数据生成两份文档。卡住就把源码视图发我,我们一起看。
任务 E(排错演练):故意把命令里的 $姓名$ 改成 $名字$ 再跑一次,观察结果——是查找失败、还是写到了别处?把现象记下来,这就是"标记不一致"的典型表现。
命令找不到、属性不知道填哪个,直接把截图或报错发我。
精读一手来源
本节首选:《开发者指南(第一辑)· 软件自动化 · Word 自动化》(含焦点、标记技巧的截图)。 查命令参数:命令手册 搜"Word"。