热搜词
发表于 2025-6-4 15:57:48 | 显示全部楼层 |阅读模式
实战案例:用Trae开发一个Word文档合并工具

我计划创建一个Word文档合并工具,使用Python和Tkinter来构建GUI,使用docx和docxcompose库来处理Word文档合并。下面是对需求的详细拆解和实现步骤。

Word文档合并工具_huier.png

痛点识别
在日常工作中,文档合并的常见痛点包括:
1.格式丢失:复制粘贴时原有的字体、样式、表格格式经常丢失
2.文档标识困难:合并后难以区分内容来源
3.效率低下:处理大量文档时手工操作耗时巨大
4.顺序混乱:缺乏直观的排序机制

解决方案设计
基于这些痛点,我们的解决方案需要具备:
1.直观的图形界面:降低使用门槛
2.拖拽排序功能:便于调整文档顺序
3.格式保持能力:确保合并后格式不丢失
4.文档标识机制:自动标注每个文档的来源
5.批量处理能力:支持一次处理多个文档

功能需求
​​1.文档选择​​:
用户可以通过按钮添加多个.docx文件。
文件列表以表格形式显示(序号、文件名、大小)。
支持移除选中文件、上移、下移、置顶、置底和清空操作。
​​
2.输出设置​​:
用户可以指定保存目录(通过浏览按钮选择)。
用户可以指定合并后的文件名(默认为“合并后文档”)。
合并选项:是否在每个文档前插入分页和文件名(加粗、居中、16磅)。
​​
3.操作按钮​​:
访问官网:打开指定网站。
开始合并:执行合并操作(在后台线程中执行,避免界面冻结)。
退出程序:关闭应用。
​​
4.状态显示​​:
进度条显示合并进度。
状态栏显示当前状态信息。
​​
5.合并功能​​:
合并时保留第一个文档的页面设置(页面方向、页边距等)。
若勾选选项,则在每个文档前插入新页并添加原文件名(作为标题,格式为加粗、16磅、居中)。
合并完成后自动打开保存目录。

技术实现
​​  1.GUI框架​​:Tkinter(包含ttk用于进度条和Treeview)。
  2.文档处理​​:使用docx库读取和创建Word文档,使用docxcompose库的Composer合并文档(注意:Composer不是标准库,需要安装docxcompose)。
​​  3.多线程​​:使用threading模块在后台执行合并任务,避免界面卡顿。
  4.文件操作​​:使用os模块处理文件路径和大小。

注意点
  • 页面设置:合并时使用第一个文档的页面设置(包括方向、页边距等)。
  • 插入文件名:如果勾选,则在每个文档前插入新页,并在新页上添加文件名(居中、加粗、16磅)。
  • 进度更新:在合并过程中更新进度条和状态信息,注意在Tkinter中通过update_idletasks刷新界面。
  • 异常处理:捕获合并过程中的异常,并通过消息框提示用户。
  • 文件覆盖:如果目标文件已存在,询问用户是否覆盖。

文件名为“Word文档合并工具_独立分页_命令行.py”,代码为:
  1. import os
  2. import copy
  3. from docx import Document
  4. from docx.enum.section import WD_SECTION  # 新增:导入分节符枚举
  5. from docx.enum.section import WD_ORIENT
  6. from docx.oxml.shared import qn
  7. from docx.shared import Pt
  8. from tqdm import tqdm
  9. from docxcompose.composer import Composer  # 补充缺失的合并器导入

  10. # 文件扫描与筛选(顶级代码块需顶格,无缩进)
  11. all_files = [f for f in os.listdir('.') if f.endswith('.docx')]
  12. source_files = [f for f in all_files if not f.lower().startswith('merged')]
  13. source_files.sort()

  14. def merge_word_documents(input_files, output_file, delete_after_merge=False):
  15.     """合并多个 Word 文档为一个文档(每个文档前插入分页符)"""
  16.     try:
  17.         # 检查输入文件列表
  18.         if not input_files:
  19.             print("错误: 没有提供要合并的文件")
  20.             return False
  21.         
  22.         # 读取首个文档以获取页面设置
  23.         first_source_doc = Document(input_files[0])
  24.         
  25.         # 初始化目标文档(保持原代码不变)
  26.         target_doc = Document()
  27.         
  28.         # 复制首个文档的页面设置(方向、页边距等)
  29.         target_section = target_doc.sections[0]
  30.         source_section = first_source_doc.sections[0]
  31.         
  32.         target_section.orientation = source_section.orientation
  33.         target_section.page_width = source_section.page_width
  34.         target_section.page_height = source_section.page_height
  35.         
  36.         # 复制页边距设置
  37.         target_section.left_margin = source_section.left_margin
  38.         target_section.right_margin = source_section.right_margin
  39.         target_section.top_margin = source_section.top_margin
  40.         target_section.bottom_margin = source_section.bottom_margin
  41.         
  42.         # 初始化合并器
  43.         composer = Composer(target_doc)
  44.         
  45.         # 逐个合并文档(首个文档不插分页符,后续文档前插入)
  46.         for index, doc_path in enumerate(input_files):
  47.             current_doc = Document(doc_path)
  48.             # 从第二个文档开始,每个文档前插入分页符
  49.             if index > 0:
  50.                 composer.doc.add_section(WD_SECTION.NEW_PAGE)  # 插入新页
  51.             composer.append(current_doc)
  52.         
  53.         # 保存合并后的文档(使用传入的output_file参数)
  54.         composer.save(output_file)
  55.         print(f"成功合并 {len(input_files)} 个文档到: {output_file}")
  56.         
  57.         # 可选: 删除原始文件
  58.         if delete_after_merge:
  59.             for file in input_files:
  60.                 os.remove(file)
  61.                 print(f"已删除: {file}")
  62.                
  63.         return True
  64.    
  65.     except Exception as e:
  66.         print(f"合并过程中发生错误: {str(e)}")
  67.         return False   

  68. if __name__ == "__main__":
  69.     # 调用合并函数,传入扫描得到的文件列表和输出路径
  70.     merge_word_documents(source_files, "merged.docx")
  71.     print("文档合并完成,结果保存为merged.docx")
复制代码

在命令行代码的功能上又添加了图形界面,最终发布为exe可执行文件,下载地址:


全部评论1
灰儿 发表于 昨天 15:35 | 显示全部楼层
代码结构与功能解析


这段代码实现了一个完整的 Word 文档合并工具,主要包含以下几个部分:

  • 导入必要的库:
    • 操作系统交互(os)
    • 多线程处理(threading)
    • 网页浏览器操作(webbrowser)
    • Word 文档处理(python-docx, docxcompose)
    • GUI 界面(tkinter)
  • DocxMergerApp 类:
    • 应用程序的主类,包含所有功能和 UI 元素
    • 采用面向对象设计,将相关功能组织在一起
  • 用户界面组件:
    • 文件选择区域:使用 Treeview 显示文件列表,支持添加、移除、排序等操作
    • 输出设置区域:包含保存路径、文件名和合并选项
    • 操作按钮:包括访问官网、开始合并和退出程序
    • 进度条和状态栏:显示操作进度和状态信息
  • 核心功能:
    • 文件管理:添加、移除、排序文件
    • 文档合并:使用 python-docx 和 docxcompose 库实现文档合并
    • 格式设置:保持第一个文档的页面设置,支持独立分页和插入文件名
    • 多线程处理:在后台线程执行合并操作,避免 UI 冻结
  • 辅助功能:
    • 输入验证:确保用户输入有效
    • 错误处理:捕获并显示合并过程中的异常
    • 进度反馈:实时显示合并进度
    • 自动打开保存目录:合并完成后自动打开保存结果的文件夹

这个应用程序的设计考虑了用户体验和功能完整性,通过清晰的界面布局和直观的操作流程,使用户能够轻松地合并多个 Word 文档。同时,多线程处理和进度反馈机制确保了在处理大型文档时应用程序仍然保持响应。

回复

使用道具 举报

回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|Archiver|手机版|小黑屋|管理员之家 ( 苏ICP备2023053177号-2 )

GMT+8, 2025-6-14 01:24 , Processed in 0.234247 second(s), 27 queries .

Powered by Discuz! X3.5

Cpoyright © 2001-2025 Discuz! Team