背景:博主在银行实习期间进行过一段时间的实习,期间有档案整理的工作,这其中一项就是为每份(不同的姓名、时间和档案编号)档案制作相同的封面,上千份的档案实在繁重,所以想到使用一下程序,此程序的用途可以修改衍生,解决其他重复性劳动。
环境:Python3.7.6,Pycharm,Win10 64位系统
材料:
from docxtpl import DocxTemplate,InlineImage from openpyxl import load_workbook import os def replace(obj): if obj is None: obj = '' return obj # 加载要填入的数据 wb = load_workbook(r"E:\Desktop\szl.xlsx") #需要填入Word的Excel工作簿的地址 ws = wb['ydk'] #工作簿中表格的名称 contexts = [] for row in range(2, ws.max_row + 1): name = ws["A" + str(row)].value #字母代表表格中对应的列,顺序和列名一定要对应上 year = ws["B" + str(row)].value mon = ws["C" + str(row)].value day = ws["D" + str(row)].value number = ws["E" + str(row)].value context = {"name": name, "year": year, "number": number,"mon":mon,"day":day} #变量名称与Word文档中的占位符要一一对应 contexts.append(context) contexts # 创建要保存的文件夹 os.mkdir("./合同封面") num=0 #在文件名称前加入序号,保证生成的文档顺序与Excel中的顺序保持一致,方便查找 for context in contexts: print(context) num=num+1 tpl = DocxTemplate(r"E:\Desktop\Users\fm.docx") #需要填入的Word文档的的地址 tpl.render(context) tpl.save("./合同封面/%d{}的封面.docx".format(context["name"])%num)
注意事项:
1、Excel的文件后缀是.xlsx,Word文档的后缀是.docx
2、确保Excel和Word文档的路径地址正确
3、注意表格名称、列名、占位符与参数的一一对应
4、特别注意:Excel中每一列的数据都必须转换成文本格式,这样Word中呈现的才会和Excel中一模一样(如果有时间格式会精确到秒)
5、占位符的含义:在英文的双层大括号{{}}中添加的占位符,即程序运行后Excel中对应的数据会填入这个位置。
结果:
更新-----程序2.0:档案有很多种类,所以封面种类也不同,但是每种封面上的内容都是姓名、日期、和编号,所以对程序进行了改进,根据不同的label(Excel文档第一列增加label列,说明是那种档案封面)选择对应的封面模板生成封面。
#将Excel表格中的数据自动填入Word指定位置 from docxtpl import DocxTemplate,InlineImage from openpyxl import load_workbook import os def replace(obj): if obj is None: obj = '' return obj # 加载要填入的数据 wb = load_workbook(r"E:\Desktop\123\test.xlsx") ws = wb['xindai'] #表格的名称 contexts = [] for row in range(1, ws.max_row + 1): #从第1行开始 label = ws["A" + str(row)].value name = ws["B" + str(row)].value #字母代表Excel中的列 year = ws["C"+str(row)].value mon = ws["D" + str(row)].value day = ws["E" + str(row)].value number = ws["F" + str(row)].value context = {"label":label,"name": name, "year": year,"mon":mon,"day":day, "number": number} contexts.append(context) contexts # 创建要保存的文件夹 os.mkdir("./合同封面") num=0 for context in contexts: print(context) num=num+1 if context.get('label') == '不分类': tpl = DocxTemplate(r"E:\Desktop\123\bufenlei.docx") elif context.get('label') == '基本': tpl = DocxTemplate(r"E:\Desktop\123\jiben.docx") elif context.get('label') == '贷后': tpl = DocxTemplate(r"E:\Desktop\123\daihou.docx") elif context.get('label') == '担保': tpl = DocxTemplate(r"E:\Desktop\123\danbao.docx") elif context.get('label') == '发放': tpl = DocxTemplate(r"E:\Desktop\123\fafang.docx") tpl.render(context) tpl.save("./合同封面/%d{}的{}封面.docx".format(context["name"],context["label"])%num)