• 程序需求:有个Word模板,有一批数据,需要根据数据批量生成多个Word

  • 注意事项:

    • 以下代码仅供参考,具体应用需要具体进行调试修改
    • word模板中需要填值的地方插入书签,书签名称要与excel中的标题名称一样
    • 如果存在多个一样的 替换内容:在书签后面加数字(例如Word中有点多个地方需要填姓名,就分别插入:姓名,姓名1,姓名2)
  • 上代码:

    # --------------------------------------
    # - -*- coding:utf-8 -*-               -
    # - Author : YYDS                      -
    # --------------------------------------
    import logging, shutil, os, re
    import tkinter as tk
    from tkinter import filedialog
    import time
    import pandas as pd
    from win32com import clientlogging.basicConfig(level=logging.DEBUG,format='%(asctime)s  line:%(lineno)d  %(levelname)s : %(message)s',datefmt=' %Y-%m-%d %H:%M:%S',filename="info.log",filemode='a')#启动独立进程
    APP=client.Dispatch('Word.Application')
    #设置是否可见,如果为false,则后台运行
    APP.Visible=Falseclass Yyds:def __init__(self):self.word_template_path = None@staticmethoddef read_excel():wd = tk.Tk()wd.withdraw()filename = filedialog.askopenfilename()df_data = pd.read_excel(filename)return df_data@staticmethoddef get_word_path():print('*' * 10 + '请选择生成的Word模板文件:' + '*' * 10)wd = tk.Tk()wd.withdraw()filename = filedialog.askopenfilename()return filename@staticmethoddef get_target_dir():print('*' * 10 + '请选择成果输出文件夹:' + '*' * 10)wd = tk.Tk()wd.withdraw()dir_name = filedialog.askdirectory()return dir_namedef copy_word_template_path(self, srcfile, dstpath):  # 复制函数if not os.path.isfile(srcfile):print("%s not exist!" % (srcfile))else:tpath, tname = os.path.split(dstpath)if not os.path.exists(tpath):os.makedirs(tpath)  # 创建路径shutil.copy(srcfile, dstpath)  # 复制文件return dstpathdef start_work(self):df_data = self.read_excel()self.word_template_path = self.get_word_path()dir_name = self.get_target_dir()for index, row in df_data.iterrows():#此处我固定死的,需要根据需求进行修改if u"姓名" in row:name = row[u"姓名"]file_path = os.path.join(dir_name, name + ".doc")self.copy_word_template_path(self.word_template_path, file_path)# 打开word文档word = APP.Documents.Open(dir_name + "/" + name + ".doc")# 获取所有书签bookmarks = word.BookMarks#遍历获取到的书签for i in bookmarks:bookmark_name = i.namei.Select()bookmark_name = ''.join(re.findall('[\u4e00-\u9fa5]', bookmark_name))if bookmark_name in row:i.Range.Text = row[bookmark_name]time.sleep(0.5)#如果替换后不要这个书签了, 可以执行删除操作# i.Delete()word.Close(-1)APP.Quit()if __name__ == '__main__':print('*' * 10 + '请选择需要处理的Excel文件' + '*' * 10)my_yyds = Yyds()my_yyds.start_work()print('*' * 10 + '结果输出完成!!!!!!' + '*' * 10)
  • 升级版!!!

    • 上图片
    • 上代码
# --------------------------------------
# - -*- coding:utf-8 -*-               -
# - Author : YYDS                       -
# --------------------------------------
import logging, shutil, os, re
import tkinter as tk
from tkinter import filedialog
from tkinter import ttk
from tkinter import font
import time
import pandas as pd
from win32com import clientlogging.basicConfig(level=logging.DEBUG,format='%(asctime)s  line:%(lineno)d  %(levelname)s : %(message)s',datefmt=' %Y-%m-%d %H:%M:%S',filename="info.log",filemode='a')#启动独立进程
APP=client.Dispatch('Word.Application')
#设置是否可见,如果为false,则后台运行
APP.Visible=Falseroot = tk.Tk()
root.title('Word生成器')
max_w, max_h = root.maxsize()
root.geometry(f'700x400+{int((max_w - 500) / 2)}+{int((max_h - 300) / 2)}')  # 居中显示
root.resizable(width=False, height=False)# 标签组件
label = tk.Label(root, text='选择Word:', font=('黑体', 15))
label.place(x=45, y=80)# 标签组件
label2 = tk.Label(root, text='选择Excel:', font=('黑体', 15))
label2.place(x=45, y=155)# 标签组件
label3 = tk.Label(root, text='选择文件夹:', font=('黑体', 15))
label3.place(x=45, y=225)# 标签组件
label4 = tk.Label(root, text='生成进度', fg='green', font=('黑体', 15, font.BOLD))
label4.place(x=300, y=350)# 输入框控件
entry_text = tk.StringVar()
entry = tk.Entry(root, textvariable=entry_text, font=('黑体', 12), width=50, state='readonly')
entry.place(x=155, y=85)# 输入框控件
entry_text2 = tk.StringVar()
entry2 = tk.Entry(root, textvariable=entry_text2, font=('黑体', 12), width=50, state='readonly')
entry2.place(x=155, y=155)# 输入框控件
entry_text3 = tk.StringVar()
entry3 = tk.Entry(root, textvariable=entry_text3, font=('黑体', 12), width=50, state='readonly')
entry3.place(x=155, y=225)#进度条
progressbarOne = ttk.Progressbar(root)
progressbarOne.pack(side=tk.BOTTOM)
progressbarOne['length']=500# 按钮控件
WORD_PATH = ''
EXCEL_PATH = ''
EXP_DIR = ''class Yyds:def __init__(self):self.word_template_path = Nonedef clear_input(self):entry_text.set('')entry_text2.set('')def get_word_path(self):# 返回一个字符串,可以获取到任意文件的路径。path1 = filedialog.askopenfilename(title='请选择Word模板路径')entry_text.set(path1)global WORD_PATHWORD_PATH = path1def get_excel_path(self):path2 = filedialog.askopenfilename(title='请选择Excel文件路径')entry_text2.set(path2)global EXCEL_PATHEXCEL_PATH = path2def get_exp_dir(self):path3 = filedialog.askdirectory(title='请选择成果输出文件夹')entry_text3.set(path3)global EXP_DIREXP_DIR = path3def copy_word_template_path(self, srcfile, dstpath):  # 复制函数if not os.path.isfile(srcfile):print("%s not exist!" % (srcfile))else:tpath, tname = os.path.split(dstpath)if not os.path.exists(tpath):os.makedirs(tpath)  # 创建路径shutil.copy(srcfile, dstpath)  # 复制文件return dstpathdef start_work(self):df_data = pd.read_excel(EXCEL_PATH, converters={u'年利率': str})progressbarOne['maximum'] = df_data.shape[0]dir_name = EXP_DIRfor index, row in df_data.iterrows():if u"姓名" in row:name = row[u"姓名"]file_path = os.path.join(dir_name, name + ".doc")self.copy_word_template_path(WORD_PATH, file_path)# 打开word文档word = APP.Documents.Open(dir_name + "/" + name + ".doc")# 获取所有书签bookmarks = word.BookMarks#遍历获取到的书签for i in bookmarks:bookmark_name = i.namei.Select()bookmark_name = ''.join(re.findall('[\u4e00-\u9fa5]', bookmark_name))if bookmark_name in row:i.Range.Text = row[bookmark_name]time.sleep(0.5)#如果替换后不要这个书签了, 可以执行删除操作# i.Delete()word.Close(-1)progressbarOne['value'] = index + 1root.update()APP.Quit()def select_word_path(self):button = tk.Button(root, text='选择Word模板', font=('黑体', 13), bg="#94D8F6", command=self.get_word_path)button.place(x=510, y=75)def select_excel_path(self):button2 = tk.Button(root, text='选择Excel数据', font=('黑体', 13), bg="#94D8F6", command=self.get_excel_path)button2.place(x=510, y=155)button3 = tk.Button(root, text='选择输出路径', font=('黑体', 13), bg="#94D8F6", command=self.get_exp_dir)button3.place(x=510, y=220)do_it = tk.Button(root, text="确定", font=('黑体', 13), fg="#138535", command=self.start_work)do_it.place(x=230, y=270)clear_it = tk.Button(root, text="取消", font=('黑体', 13), fg="#ED1C24", command=self.clear_input)clear_it.place(x=400, y=270)root.mainloop()if __name__ == '__main__':my_yyds = Yyds()my_yyds.select_word_path()my_yyds.select_excel_path()

批量自动生成Word程序相关推荐

  1. Python 自动化教程(5) : 自动生成Word文件

    系列教程: Python 自动化教程(1) 概述,第一篇 Excel自动化 Python 自动化教程(2) : Excel自动化:使用pandas库 Python 自动化教程(3) : 自动生成PPT ...

  2. Java使用FreeMarker自动生成Word文档(带图片和表单)

    Java使用FreeMarker自动生成Word文档(带图片和表单) 1 背景 2 目标效果 3 创建Word模板 3.1 创建模板文档 3.2 转换模板文档 3.3 处理模板文档中的占位符 3.4 ...

  3. 小学生的计算题自动生成小程序「python」

    小学生的计算题自动生成小程序「python」 #!/usr/bin/python # -*- coding: UTF-8 -*- #liuqiping fred from docx import Do ...

  4. python将Excel数据自动生成Word报告【Pyhon-docx\openpyxl】

    我写在了知乎,图片没有搬运过来.链接:https://zhuanlan.zhihu.com/p/371767402 需求:日常工作中,需要对Excel表格的数据进行筛选计算整理,然后将数据做成Word ...

  5. 一篇文章告诉你如何在报表系统中实现自动生成Word报告

    点击获取ActiveReports v14.0最新版下载 在报表系统中,生成Word报告的常见步骤分为以下四步:采集原始数据.值后台传递.生成最终报告模板.实现打印和预览.可见,系统在生成报告之前,需 ...

  6. 【Power Automate】如何自动生成Word与PDF文件[上]

    上半年已经悄悄溜走,因为疫情,大家似乎也很习惯于在家办公.作为业务人员,如何汇报自己的工作,让自己更多地学习和掌握数字化办公技巧至关重要.那么今天我们就来看一下在不使用代码的情况下,如何通过Power ...

  7. 自动生成小程序的智能建站系统,项目分享

    有段时间没有更新博客了,想分享一个自己做的项目. www.icloud18.com(i云-自动建站小程序系统) 这是自己带领i云团队,夜以继日开发半年,从0至1做了这个项目,一个可以自动生成小程序的建 ...

  8. 使用FreeMarker自动生成Word文档

    使用FreeMarker自动生成Word文档 获取文件路径 创建一个word文档,然后再文档中在文档中写标识,对应代码中的map数据 2.将word转为xml后缀文件,再转为.ftl文件 3.保存路径 ...

  9. 关于python-docx自动生成word文档的总结

    目录 一.结构 二.常用的API介绍 三.实例展示 展示一 展示二 最近接到一个需求--把数据库里的数据做成表格,然后形成一本书,打印出来送给客户.由于系统目前没有自动导出word或者excel类似的 ...

最新文章

  1. Kali Linux 2017中Scapy运行bug解决
  2. java logout session_在jsp里做“退出登录”, session.setAttribute(id,null)居然出错。高手救命啊!...
  3. php lalaogu cn,php安装编译时错误合集
  4. Storm之Bolt-接口
  5. 围成一圈的排列组合问题_约瑟夫问题
  6. Huffman(哈夫曼)编码--又称最佳编码(最有效的二进制编码)
  7. 耶鲁大学计算机科学录取,2020年耶鲁大学排名TFE Times美国最佳计算机科学硕士专业排名第18...
  8. 解决SublimeCodeIntel回车换行误打代码
  9. OpenGL, GLSL, DirectX, HLSL中的矩阵存储形式
  10. 【教程】把PPT转WORD形式的方法
  11. Java入门到大神你需要掌握这些技术
  12. NameValueCollection Dictionary区别
  13. [sql]join的5种方式:inner join、left(outer) join、right (outer) Join、full(outer) join、cross join...
  14. 字符串的查找删除 详解(C++)
  15. Xshell6 安装包下载
  16. 对于LabVIEW操作者框架的理解
  17. methylKit:差异甲基化分析
  18. CV7 颜色追踪和图像阈值
  19. 医疗his系统值不值得投入使用
  20. 融入动画技术的粒子效果文字动画交互应用

热门文章

  1. flv.js 是一个使用纯JavaScript编写的FLV(HTML5 Flash Video)播放器
  2. 双系统下ubuntu16.04备份和还原、彻底删除和重装(包含迁移) 亲跳多坑!!
  3. 基于定位、地点搜索的驾车路线规划
  4. 同济大学博导陈明:解读中国制造2025
  5. PBOC命令格式解析1
  6. tomcat和undertow、jetty、netty的区别
  7. 上海亚商投顾:沪指失守3000点 半导体、白酒领跌两市
  8. modelsim-win64-10.1c-se.exe安装备忘
  9. 打字狗打字练习 - java关键字
  10. 鸣礼炮21响的含义c语言,健身21响礼炮什么意思?怎么做?一次适合练几组? 21响礼炮做法详解...