【免费】利用python实现一键替换多个Word文档中的页眉页脚

Python3.8

Python3.8

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

推荐【免费】自动检测删除微信好友教程 微信一键清死粉

日常生活中我们从网上找到的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() 

您可能感兴趣的与本文相关的镜像

Python3.8

Python3.8

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

凉亭下

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值