日常生活中我们从网上找到的Word资料中有很多都是加了水印的,随着AI的加持,我们编写代码的门槛越来越低,今天我就用python实现一个一键替换多个Word文件中的页眉页脚
以下是软件运行起来后的界面

下面附上全部代码
import tkinter as tk
from tkinter import filedialog, ttk, messagebox
import os
from docx import Document
from docx.enum.text import WD_ALIGN_PARAGRAPH
from docx.oxml import OxmlElement
from docx.oxml.ns import qn
class HeaderFooterReplacer:
def __init__(self, root):
self.root = root
self.root.title("Word文档页眉页脚替换工具")
self.root.geometry("800x600")
# 创建主框架
self.main_frame = ttk.Frame(self.root, padding="10")
self.main_frame.grid(row=0, column=0, sticky=(tk.W, tk.E, tk.N, tk.S))
# 目录选择
ttk.Label(self.main_frame, text="选择目录:").grid(row=0, column=0, sticky=tk.W)
self.folder_path = tk.StringVar()
ttk.Entry(self.main_frame, textvariable=self.folder_path, width=70).grid(row=0, column=1, padx=5)
ttk.Button(self.main_frame, text="浏览", command=self.select_folder).grid(row=0, column=2)
# 页眉设置框架
self.header_frame = ttk.LabelFrame(self.main_frame, text="页眉设置", padding="5")
self.header_frame.grid(row=1, column=0, columnspan=3, sticky=(tk.W, tk.E), pady=10)
# 旧页眉
ttk.Label(self.header_frame, text="查找页眉:").grid(row=0, column=0, sticky=tk.W)
self.old_header_text = tk.StringVar()
ttk.Entry(self.header_frame, textvariable=self.old_header_text, width=70).grid(row=0, column=1, padx=5, pady=5)
# 新页眉
ttk.Label(self.header_frame, text="替换为:").grid(row=1, column=0, sticky=tk.W)
self.new_header_text = tk.StringVar()
ttk.Entry(self.header_frame, textvariable=self.new_header_text, width=70).grid(row=1, column=1, padx=5, pady=5)
# 页脚设置框架
self.footer_frame = ttk.LabelFrame(self.main_frame, text="页脚设置", padding="5")
self.footer_frame.grid(row=2, column=0, columnspan=3, sticky=(tk.W, tk.E), pady=10)
# 旧页脚
ttk.Label(self.footer_frame, text="查找页脚:").grid(row=0, column=0, sticky=tk.W)
self.old_footer_text = tk.StringVar()
ttk.Entry(self.footer_frame, textvariable=self.old_footer_text, width=70).grid(row=0, column=1, padx=5, pady=5)
# 新页脚
ttk.Label(self.footer_frame, text="替换为:").grid(row=1, column=0, sticky=tk.W)
self.new_footer_text = tk.StringVar()
ttk.Entry(self.footer_frame, textvariable=self.new_footer_text, width=70).grid(row=1, column=1, padx=5, pady=5)
# 选项设置
self.options_frame = ttk.LabelFrame(self.main_frame, text="选项", padding="5")
self.options_frame.grid(row=3, column=0, columnspan=3, sticky=(tk.W, tk.E), pady=10)
# 是否删除所有页眉页脚
self.delete_all = tk.BooleanVar(value=False)
ttk.Checkbutton(self.options_frame, text="删除所有页眉页脚",
variable=self.delete_all).grid(row=0, column=0, sticky=tk.W)
# 处理按钮
ttk.Button(self.main_frame, text="开始替换", command=self.process_files).grid(row=4, column=0, columnspan=3, pady=20)
# 进度条
self.progress = ttk.Progressbar(self.main_frame, length=600, mode='determinate')
self.progress.grid(row=5, column=0, columnspan=3, pady=5)
# 状态标签
self.status_label = ttk.Label(self.main_frame, text="")
self.status_label.grid(row=6, column=0, columnspan=3)
def select_folder(self):
folder = filedialog.askdirectory()
if folder:
self.folder_path.set(folder)
def delete_paragraph(self, paragraph):
p = paragraph._element
p.getparent().remove(p)
paragraph._p = paragraph._element = None
def replace_header_footer(self, doc):
for section in doc.sections:
# 处理页眉
header = section.header
if self.delete_all.get():
# 删除所有页眉
for paragraph in header.paragraphs:
self.delete_paragraph(paragraph)
else:
if self.old_header_text.get():
# 查找并替换指定页眉
for paragraph in header.paragraphs:
if self.old_header_text.get() in paragraph.text:
if self.new_header_text.get():
paragraph.text = self.new_header_text.get()
paragraph.alignment = WD_ALIGN_PARAGRAPH.CENTER
else:
self.delete_paragraph(paragraph)
elif self.new_header_text.get():
# 添加新页眉
header.paragraphs[0].text = self.new_header_text.get()
header.paragraphs[0].alignment = WD_ALIGN_PARAGRAPH.CENTER
# 处理页脚
footer = section.footer
if self.delete_all.get():
# 删除所有页脚
for paragraph in footer.paragraphs:
self.delete_paragraph(paragraph)
else:
if self.old_footer_text.get():
# 查找并替换指定页脚
for paragraph in footer.paragraphs:
if self.old_footer_text.get() in paragraph.text:
if self.new_footer_text.get():
paragraph.text = self.new_footer_text.get()
paragraph.alignment = WD_ALIGN_PARAGRAPH.CENTER
else:
self.delete_paragraph(paragraph)
elif self.new_footer_text.get():
# 添加新页脚
footer.paragraphs[0].text = self.new_footer_text.get()
footer.paragraphs[0].alignment = WD_ALIGN_PARAGRAPH.CENTER
def process_files(self):
folder_path = self.folder_path.get()
if not folder_path:
messagebox.showerror("错误", "请选择目录!")
return
if not self.delete_all.get() and not any([self.old_header_text.get(), self.new_header_text.get(),
self.old_footer_text.get(), self.new_footer_text.get()]):
messagebox.showerror("错误", "请输入要查找或替换的内容,或选择删除所有页眉页脚!")
return
# 获取所有Word文件
word_files = []
for root, dirs, files in os.walk(folder_path):
for file in files:
if file.endswith('.docx') and not file.startswith('~$'):
word_files.append(os.path.join(root, file))
if not word_files:
messagebox.showinfo("提示", "未找到Word文件!")
return
self.progress['maximum'] = len(word_files)
self.progress['value'] = 0
processed_count = 0
error_count = 0
for i, file_path in enumerate(word_files):
try:
doc = Document(file_path)
self.replace_header_footer(doc)
# 保存文件
output_path = os.path.join(os.path.dirname(file_path),
f"modified_{os.path.basename(file_path)}")
doc.save(output_path)
processed_count += 1
except Exception as e:
error_count += 1
print(f"处理文件 {file_path} 时出错: {str(e)}")
finally:
self.progress['value'] = i + 1
self.root.update_idletasks()
status = f"处理完成!成功:{processed_count}个文件"
if error_count > 0:
status += f",失败:{error_count}个文件"
self.status_label.config(text=status)
messagebox.showinfo("完成", status)
if __name__ == "__main__":
root = tk.Tk()
app = HeaderFooterReplacer(root)
root.mainloop()

1万+

被折叠的 条评论
为什么被折叠?



