最近有个朋友请我帮忙,想根据表格中的邀请名单批量生成一批邀请函word文档,邀请函的格式固定,也就是说每个邀请函模板一致,只是被邀请人的姓名不一致。这样重复劳动最适合用Python解决了,下面是我的方案:
1. 设立模板文件占位符
我们首先把邀请函里邀请人的姓名改为:受邀人
,作为一个特定的占位符,方便我们后期替换,比如下面这个是我模拟的一份邀请函模板 template.docx
受邀人:
诚邀您参加小方的婚礼,请您于2022年13月32日来不存在的地方用餐。
---- 2022年8月12日
...
(这里有一些带格式的图片、表格)
2. 预处理表格
非程序员整的表格一般都有一些冗余信息,不方便处理,所以我们要整一个方便程序读入的表格格式,如下是我已经处理好的表格 list.xlsx
序号 | 所属公司 | 姓名 |
---|---|---|
1 | 字节 | 小方 |
2 | 腾讯 | 小王 |
3 | 阿里 | 小李 |
4 | 百度 | 小赵 |
3. 编写脚本
3.1 环境安装
本脚本运行环境:Python 3.9
,
所用库:python-docx
、pandas
、numpy
3.1 读取表格
我们使用 pandas
来进行读取
df = pd.read_excel(r"list.xlsx")
3.2 遍历表格内容
我们采用 元组迭代,逐行读取
for row in df.itertuples():
idx = getattr(row, '序号')
company = getattr(row, '所属公司')
name = getattr(row, '姓名')
generate_word(idx, company, name) # 核心函数,先占个位
3.3 生成邀请函
实现3.2中的generate_word函数
def generate_word(idx, company, name):
document = Document(r"./template.docx") #读取模板
for p in document.paragraphs: # 遍历每个段落
if '受邀人' in p.text: # 判断每个段落是否含有占位符"受邀人"
# 如果有,则继续遍历每个"字块",这里不直接替换是因为要保留格式
for run in p.runs:
if '受邀人' in run.text:
run.text = run.text.replace('受邀人', f'{company}的{name}')
run.italic = False
document.save(f'{idx}-{company}-{name}.docx') # 生成文档
3.4 总结
import numpy as np
import pandas as pd
from docx import Document
def generate_word(idx, company, name):
document = Document(r"./template.docx") #读取模板
for p in document.paragraphs: # 遍历每个段落
if '受邀人' in p.text: # 判断每个段落是否含有占位符"受邀人"
# 如果有,则继续遍历每个"字块",这里不直接替换是因为要保留格式
for run in p.runs:
if '受邀人' in run.text:
run.text = run.text.replace('受邀人', f'{company}的{name}')
run.italic = False
document.save(f'{idx}-{company}-{name}.docx') # 生成文档
if __name__=="__main__":
df = pd.read_excel(r"list.xlsx")
for row in df.itertuples():
idx = getattr(row, '序号')
company = getattr(row, '所属公司')
name = getattr(row, '姓名')
generate_word(idx, company, name)
当然,这个只是简化后的版本,真实场景可以无限拓展,思路是差不多的。