python 图形界面多个WORD按名字排序合并成一个WORD

python 复制代码
import wx
import os
import re
import datetime  # 导入时间模块,用于生成时间格式文件名
import win32com.client as win32
from docx import Document
from natsort import natsorted  # 导入自然排序库,解决数字文件名乱序问题

class MyFrame(wx.Frame):
    def __init__(self, parent, title):
        super(MyFrame, self).__init__(parent, title=title, size=(400, 200))
        panel = wx.Panel(self)
        
        self.dir_picker = wx.DirPickerCtrl(panel, style=wx.DIRP_DIR_MUST_EXIST)
        self.btn_merge = wx.Button(panel, label='合并')
        
        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(wx.StaticText(panel, label='选择要合并的文件夹:'), 0, wx.ALL, 5)
        sizer.Add(self.dir_picker, 0, wx.EXPAND|wx.ALL, 5)
        sizer.Add(self.btn_merge, 0, wx.ALIGN_CENTER|wx.ALL, 5)
        
        panel.SetSizer(sizer)
        self.Bind(wx.EVT_BUTTON, self.on_merge, self.btn_merge)
    def natural_sort_key(self, filename):
        #自定义自然排序键,支持中英文、数字混合文件名排序"""​
        # 分离文件名中的数字和非数字部分,用于精准排序​
        parts = re.split('(\d+)', filename)
        # 数字部分转为整数,非数字部分保留字符串,实现自然排序​
        return [int(part) if part.isdigit() else part.lower() for part in parts] 
     
    def on_merge(self, event):
        folder_path = self.dir_picker.GetPath()
        if not os.path.exists(folder_path):
            wx.MessageBox('指定的文件夹不存在!', '错误', wx.OK | wx.ICON_ERROR)
            return
        
        try:
           merged_doc = Document()  # 创建新文档
           # 筛选出文件夹中的docx文件,并按自然排序排列
           docx_files = [f for f in os.listdir(folder_path) if f.lower().endswith(".docx")]
           # 两种排序方式可选,推荐自然排序(适配数字文件名)
           # 方式1:自然排序(需安装natsort库,更精准)
           sorted_files = natsorted(docx_files)
            # 方式2:自定义自然排序(无需额外安装库,适配大部分场景)
            # sorted_files = sorted(docx_files, key=self.natural_sort_key)
           if not sorted_files:
              wx.MessageBox('文件夹中无DOCX文件可合并!', '提示', wx.OK | wx.ICON_INFORMATION)
              return
           for filename in sorted_files:
                file_path = os.path.join(folder_path, filename)
                doc = Document(file_path)
                # 为每个文件添加标题(可选,便于区分不同文件内容)
                merged_doc.add_heading(filename, level=2)
                # 复制每个段落到合并文档,保留原格式
                for paragraph in doc.paragraphs:
                    new_para = merged_doc.add_paragraph()
                    for run in paragraph.runs:
                         new_run = new_para.add_run(run.text)
                         new_run.bold = run.bold
                         new_run.italic = run.italic
                         new_run.underline = run.underline
                         new_run.font.name = run.font.name
                         new_run.font.size = run.font.size
                         new_run.font.color.rgb = run.font.color.rgb
                # 每个文件结束后添加分页符(可选,避免内容粘连)
                merged_doc.add_page_break()
           current_time = datetime.datetime.now().strftime("%Y%m%d%H%M%S%f")[:-3]  # 截取前17位,去掉微秒后3位,保留毫秒
           # 优化导出文件名,拼接时间戳,避免重复
           merged_filename = f'合并后的文档_{current_time}.docx'
           # 保存合并后的文件,路径改为与源文件夹同目录,便于查找
           merged_path = os.path.join(folder_path, merged_filename)
           merged_doc.save(merged_path)
           wx.MessageBox(f'合并完成!{merged_filename}文件保存至:\n{merged_path}', '成功', wx.OK | wx.ICON_INFORMATION)
        except Exception as e:
            wx.MessageBox(f'合并过程中发生错误:{str(e)}', '错误', wx.OK | wx.ICON_ERROR)
app = wx.App()
frame = MyFrame(None, 'DOC文件合并')
frame.Show()
app.MainLoop()

摘要:该代码实现了一个DOCX文档合并工具,使用wxPython创建GUI界面。主要功能包括:1) 选择文件夹路径并自动识别所有DOCX文件;2) 采用自然排序算法(natsorted)处理文件名;3) 保留原文档格式(字体、颜色等样式)合并内容;4) 自动添加分页符和文件名标题;5) 生成带时间戳的合并文件。程序具有错误处理机制,支持中英文和数字混合文件名的精准排序,最终将合并文档保存在原文件夹中。

相关推荐
jiang_changsheng10 分钟前
RTX 2080 Ti魔改22GB显卡的最优解ComfyUI教程
python·comfyui
喵叔哟19 分钟前
06-ASPNETCore-WebAPI开发
服务器·后端·c#
2501_9307077838 分钟前
使用 C# .NET 从 PowerPoint 演示文稿中提取背景图片
c#·powerpoint·.net
0思必得01 小时前
[Web自动化] Selenium处理滚动条
前端·爬虫·python·selenium·自动化
沈浩(种子思维作者)1 小时前
系统要活起来就必须开放包容去中心化
人工智能·python·flask·量子计算
2301_790300961 小时前
Python数据库操作:SQLAlchemy ORM指南
jvm·数据库·python
初级代码游戏1 小时前
套路化编程 C# winform 自适应缩放布局
开发语言·c#·winform·自动布局·自动缩放
m0_736919101 小时前
用Pandas处理时间序列数据(Time Series)
jvm·数据库·python
getapi1 小时前
实时音视频传输与屏幕共享(投屏)
python
java干货2 小时前
为什么 “File 10“ 排在 “File 2“ 前面?解决文件名排序的终极算法:自然排序
开发语言·python·算法