批量自动生成Word程序
Posted 小蜗牛爱远行
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了批量自动生成Word程序相关的知识,希望对你有一定的参考价值。
-
程序需求:有个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 client logging.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=False class Yyds: def __init__(self): self.word_template_path = None @staticmethod def read_excel(): wd = tk.Tk() wd.withdraw() filename = filedialog.askopenfilename() df_data = pd.read_excel(filename) return df_data @staticmethod def get_word_path(): print('*' * 10 + '请选择生成的Word模板文件:' + '*' * 10) wd = tk.Tk() wd.withdraw() filename = filedialog.askopenfilename() return filename @staticmethod def get_target_dir(): print('*' * 10 + '请选择成果输出文件夹:' + '*' * 10) wd = tk.Tk() wd.withdraw() dir_name = filedialog.askdirectory() return dir_name def 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 dstpath def 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.name i.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)
以上是关于批量自动生成Word程序的主要内容,如果未能解决你的问题,请参考以下文章