• 程序需求:有个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. “35岁才是一个程序员成熟的开始!”
  2. ZooKeeper简介(安装和使用)
  3. 使用eBPFBCC提取内核网络流量信息
  4. python hashlib模块
  5. java中的IO详解(上)
  6. 指针嵌套指针 拷贝_C++智能指针小结
  7. leetcode 131. Palindrome Partitioning | 131. 分割回文串(递归解法)
  8. oh-my-zsh upgrade problem
  9. pip安装的库导入pycharm中
  10. java math 函数_Java中Math类常用函数总结
  11. 启动u盘自动运行服务器,WinPE网启服务器自动配置程序
  12. 端口号及对应的服务汇总 (适用于Linux/Windows系统)
  13. XmlPullParser文件解析android
  14. lazarus中截取整个屏幕画面并保存为指定文件
  15. 200中国姓氏日语发音
  16. Linux系统学习方法论 1
  17. 下面列出了 网上招聘,人才招聘,招聘信息,网上求职,招聘机遇,招聘网,人才网,工作网
  18. ev4转换MP4格式教程
  19. VR/AR的需求和前景
  20. MATLAB 马尔可夫链

热门文章

  1. 卡内基《每日一智》---我们在智慧中成长
  2. 类之间的关系(关联、继承、聚合、组合、依赖、实现)
  3. 字节跳动面经-游戏岗
  4. 圆弧中点坐标值求解(二维平面三维空间)(3.1增加三维部分)-①
  5. CMA Introduce
  6. 子集构造法和含有空串的子集构造法
  7. 深度学习领域最新成果——“动态外科手术”算法
  8. 同城物流附近的物流公司电话源码
  9. 简述文件服务器的主要功能,文件服务器的作用
  10. java调用方法_JAVA中方法的调用(详细整理)