批量自动生成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程序的主要内容,如果未能解决你的问题,请参考以下文章

python-office自动化办公:Word批量转PDF

文件夹照片批量插入word

word中批量修改图片大小的两个方法

Word/WPS 利用邮件合并批量生成文档

Word/WPS 利用邮件合并批量生成文档

Mac系统下Python自动化批量word转换pdf