也许你会遇到一个需求,需要批量制作给很多人的信,这些信的内容结构上都是一样的,只有一些细节是不一样的,那么你该怎么完成这个需求? 是一个个复制word内容吗?
实际案例
这里给大家介绍一个强大的功能,通过使用word的mergedField功能生成规范的word模板,在这里,给大家举个例子。我们的例子是个很贴近收物业费的例子,我们从excel中都能看到一个小区的业主姓名、单元号、楼层号、面积、物业费等信息,这里要针对每一个户生成一个单独的word文件。
我们先看一下这个excel的内容:
小区业主表
让我们再看一下这个小区的收取物业费的word的内容:
尊敬的XXX业主:
感谢您选择魏蜀吴小区,现小区收取2020年物业费,您位于X号楼X单元X号的房子共需要缴纳物业费XX元(XX平方米*2.2元/平方米),请您在看到该收据之后于本月月底到物业缴纳物业费,感谢您的支持。
魏蜀吴小区物业敬上
小区物业费的通知单
如果按照例子中的生成10个用户的信息我们通过复制粘贴的方式还能生成,但是小区都有几百户居民,这么再采用复制粘贴的模式就太痛苦了。
MergedField
我们用mergedField的模式,所谓MergedField也就是合并域,这里叫合并域是为了从外面加参数自动加载生成一份这样的文档。通过下面的动图,我们来告诉你怎么加入一
个mergedField:
上面的方式就是插入一个meregeField的方法,插入->文档部件->域->mergeField 然后在弹出来的对话框中填上域的名字就可以了。
当然我们还是需要先找到有这样能力的包,这个包叫mailmerge,我们通过
pip install mailmerge --user
把这个能力引入到python环境中。
代码实战
代码类似下面这样:
#coding:utf-8
import xlrd
from mailmerge import MailMerge
import os
#下面读取excle的内容然后进行存储
workbook = xlrd.open_workbook("word1.xlsx")
#下面对worksheet创建目录
work_sheet_list = workbook.sheet_names()
print(work_sheet_list)
for Sheet_Name in work_sheet_list:
try:
worksheet = workbook.sheet_by_name(Sheet_Name)
sheet_rows = worksheet.nrows
isExists = os.path.exists(Sheet_Name)
if not isExists:
os.makedirs(Sheet_Name)
# 从第二行开始
i = 1
# 一共有10行
end = sheet_rows print(end)
while i < end:
userName = worksheet.cell(i, 1).value
print(userName)
build_num = worksheet.cell(i, 2).value
unit_num = worksheet.cell(i, 3).value
hu_num = worksheet.cell(i, 4).value
squre = worksheet.cell(i, 5).value
squre_str = str(squre)
print(squre)
print(type(squre_str))
squre_money = float(squre) * 2.2
squre_money_str = str(squre_money)
template = "尊敬的XXX业主.docx"
document = MailMerge(template)
print(document.get_merge_fields())
document.merge(
BuildingN = str(build_num),
BuildingNum = str(build_num),
Num = str(hu_num),
Money = squre_money_str,
Square = squre_str )
print(Sheet_Name)
print(userName)
document.write(Sheet_Name + "\\" + userName + ".docx")
i += 1 print (i)
except ():
pass
最后生成的文档就是这样的样子:
最终,生成的文档都在被保存在程序目录下面。如果采用这种方式,是不是非常方便?心动了吗?你也自己试试。