办公需求
批量周计划后发现里面的某些文字需要替换,如“小结”变成“小结:”,“提问”变成“重点提问”,搜索多个已有的相关代码后,发现它们虽然能够替换文字,但是也同时把周计划表格部分的格式清洗了一次——加粗居中的字体全部不加粗居左。
需求实现:
不断搜索后,最终在简书找到一个可以不改变原格式的docx的内部文字替换的优质代码。花了几个小时尝试注释代码,朦胧地了解设计流程。随后通过全网搜索,微调代码内容,用四行代码实现了输入input查找替换的功能。
'''
作者:小强聊成长
链接:https://www.jianshu.com/p/39eb9fc1606d
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
'''
from pathlib import Path
import win32com.client as win32
yml = Path('C:\\Users\\Administrator\\Desktop\\5\\')#替换前文件都放在这个文件夹
xml = Path('C:\\Users\\Administrator\\Desktop\\6\\')#可以自动生成 替换后文件
# xml = Path('C:\\Users\\Administrator\\Desktop\\5\\')#替换前替换后的文字在同一个文件内,覆盖替换
if not xml.exists():#如果替换后的文件路径不存在
xml.mkdir(parents=True) #自动创建一个替换后的目录 比如桌面没有文件夹2 但会自动生成
# mkdir创建目录
# parents:如果父目录不存在,是否创建父目录。mkdir(parents=True, exist_ok=True)如果父目录是存在,那么根据需要创建这条路径
#
file_list = list(yml.glob('*.docx'))# glob获取一个可编历对象,使用它可以逐个获取匹配的文件路径名
# 文件列表等于 列表(遍历替换前目录中的docx)
# 阿夏设置成input手动输入“替换前词语、替换后词语” 但是只能输入一个词语替换
# replace_dict={}# 替换字典的字典为空 这条在这里可以省略
old=input("替换前词语:\n")
new=input("替换后词语:\n")
replace_dict={old:new}# 替换字典的名字的键为old的值,值为new的值,都不要冒号,这里测了很久才成功
# print(contacts)
# 原作者的替换方法是直接把两个词语写在字典里,支持多个。
# replace_dict = {'张三:'李四',
# '方案':'计划',
# }# 替换字典包括
word = win32.gencache.EnsureDispatch('Word.Application')
# win32com.client.gencache源文件目录代码 EnsureDispatch确保调用word
word.Visible = False# 属性不可见
cs1 = win32.constants # win32常量?
for i in file_list: # 遍历 替换前的文件夹中docx文件内容
doc= word.Documents.Open(str(i)) # 打开文件,并将其添加到文档集合。返回Document对象。
print(i.name) #打印 word文件名的名字 例第8周的周计划(大8班下学期).docx
for old_txt, new_txt in replace_dict.items():
# 若旧名和新名在替换字典的项目列表里
# findobj返回根对象的句柄和所有子对象
findobj = word.Selection.Find # 如果查找操作成功,选定内容就会更改。
findobj.ClearFormatting()#清楚格式
findobj.Text = old_txt #旧文字
findobj.Replacement.ClearFormatting() # 替换部分清楚格式
findobj.Replacement.Text = new_txt #新文字
if findobj.Execute(Replace=cs1.wdReplaceAll): # 实施 替换所有匹配项
print(f'{old_txt}-->{new_txt}') # 打印替换内容
new_file = xml / i.name
# 新文件的路劲 等于 新文件路径(前面的路径) / 内部的Word文件名字 如 C:\Users\Administrator\Desktop\6\第3周的周计划(大8班下学期).docx
# 如 C:\Users\Administrator\Desktop\6\第4周的周计划(大8班下学期).docx
doc.SaveAs(str(new_file))
# 保存新文件名
doc.Close()
# 关闭文件
word.Quit()
# word退出
输入词语并运行
效果展示:
替换前:5文件夹内 的docx 标题是 小(8)班
替换后:6文件夹内 的docx 标题是 大(8)班(每篇都改过了)
不过我还没有找到可以多个docx批量替换内容,并把替换后的字体加粗的代码。为了赶时间,只能手动一页页周计划打开,把“小结”两个字批量查找替换加粗,废了不少时间。学过python,再也不想做这么蠢的重复劳动了,后续努力把这个代码研究出来