# 导入模块
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())))
标签:docx,word,记录,doc,list,file,path,替换
From: https://www.cnblogs.com/AZ26/p/18216868