python-记录word替换数据-2

# 导入模块
from docx import Document
import os
from win32com.client import Dispatch
import pandas as pd


# 转换doc文件
def doc_to_docx(file_path):
    """
    将指定的doc文件转化为docx格式
    :param file_path: 文件路径
    """
    word = Dispatch("Word.Application")
    # 打开原始文档
    doc = word.Documents.Open(file_path)
    # 将文档另存为docx格式
    new_file_path = os.path.splitext(file_path)[0] + ".docx"
    doc.SaveAs(new_file_path, 16)
    # 关闭文档
    doc.Close()
    word.Quit()
    # 删除原始文件——正式发布后删除原文件
    # os.remove(file_path)
    # 打印操作过程
    print(f"{file_path}已经被成功转换为{new_file_path}")
    return new_file_path


#
# def main():
#     # 定义文件夹路径和Word应用程序对象
#     folder_path = r"C:\临时"
#     # 遍历文件夹中所有的.doc文件,并将其转换为.docx格式
#     for root, dirs, files in os.walk(folder_path):
#         for file in files:
#             if file.endswith(".doc"):
#                 file_path = os.path.join(root, file)
#                 doc_to_docx(file_path, word)
#
#     # 关闭Word应用程序
#     word.Quit()
#
#     print("全部doc文件已经全部转换为docx!")


# # 创建doc对象
# doc = Document('文档.docx')


def replace_word(doc_path, excel_path):
    """
    定义批量替换文字的函数
    :param doc_path: 上传的word模板
    :param excel_path: excel的数据表
    :return:
    """
    # 判断传入文件后缀名,docx包只能用于处理docx文件
    end = os.path.splitext(doc_path)[1]
    if (end == '.doc') | (end == '.DOC'):
        docx_path = doc_to_docx(doc_path)
    else:
        docx_path = doc_path

    # 读取数据文件
    df = pd.read_excel(excel_path, dtype=str)
    df.fillna('', inplace=True)
    for i in df.iterrows():
        # 读取模板文件创建docx对象
        doc = Document(docx_path)
        # 迭代df,并将列明和每一行内容组成字典
        data_dict = dict(i[1])
        # 列表化并压缩表头 行内容 分配给旧值与新值(eg:倒转list内容,避免mark1替换mark11为  替换内容1 ,优先替换mark11
        old_word_list = list(data_dict.keys())
        new_word_list = list(data_dict.values())
        old_word_list.reverse()
        new_word_list.reverse()
        print(old_word_list, new_word_list)
        # 用倒转后的列表,进行替换
        for old_word, new_word in zip(old_word_list, new_word_list):
            print(old_word, '已替换', new_word)

            # 核心检索替换部分
            for p in doc.paragraphs:  # 遍历文档段落
                for run in p.runs:  # 遍历段落的字块
                    # print(run.text)
                    run.text = run.text.replace(old_word, new_word)  # 替换字块的文字,然后赋值给字块

            # 遍历文档的表格, 替换表格里的要替换的文字
            for table in doc.tables:
                for row in table.rows:
                    for cell in row.cells:
                        # print(cell.text)
                        cell.text = cell.text.replace(old_word, new_word)
        #  已替换数据中第一个值为新名称命名生成的word文件
        doc.save(os.path.join(os.path.dirname(docx_path), list(data_dict.values())[0] + '.docx'))


# 执行替换函数

doc_path = r'E:\开发\1565-法人变更模板填写机器人\法人变更模板填写机器人20230103\模板.doc'
excel_path = r'E:\开发\1565-法人变更模板填写机器人\法人变更模板填写机器人20230103\excel数据.xlsx'
replace_word(doc_path, excel_path)

# print(os.path.dirname(doc_path))

# dict_1 = {
#     '1': '2',
#     '2': '2',
#     '3': '2'
#     }
# print(list(dict_1.keys()), type(list(dict_1.keys())))
posted @ 2024-05-27 23:34  AZ26  阅读(40)  评论(0)    收藏  举报