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) 生成带时间戳的合并文件。程序具有错误处理机制,支持中英文和数字混合文件名的精准排序,最终将合并文档保存在原文件夹中。