You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Python将Word指定章节内容复制到新文档

按指定章节名提取Word内容到独立文档的实现方案

你找到的示例代码是基于Word原生物理分节(通过插入分节符生成的Section对象)做拆分,和你需要的「按统一命名的逻辑章节匹配提取」的场景不匹配,用Aspose.Words可以直接通过标题定位+区间节点收集的方式实现需求,不需要依赖物理分节。

核心实现逻辑分3步:

  • 定位目标章节:遍历文档段落,匹配样式为指定标题级别、文本符合章节命名规则的段落,作为章节起点
  • 确定章节边界:从起点开始向后遍历所有文档节点,直到遇到下一个同级别/更高级别的标题,即为当前章节的终点
  • 导出内容:新建空白文档,将起点到终点之间的所有节点(包含段落、表格、图片、列表等全部内容)保留原格式导入新文档后保存

可直接运行的参考代码如下:

import aspose.words as aw

# 基础配置,按需修改
SOURCE_DOC_PATH = "你的年报文档路径.docx"
TARGET_CHAPTER_NAME = "Project 1"  # 要提取的目标章节名
OUTPUT_DOC_PATH = f"{TARGET_CHAPTER_NAME}_独立报告.docx"
CHAPTER_HEADING_LEVEL = 1  # 项目章节对应的标题级别,一级标题填1,二级填2

# 加载源文档,初始化空白目标文档并清空默认空段落
source_doc = aw.Document(SOURCE_DOC_PATH)
target_doc = aw.Document()
target_doc.first_section.body.remove_all_children()

is_collecting = False
target_heading_style = aw.StyleIdentifier.HEADING_1 + CHAPTER_HEADING_LEVEL - 1

# 遍历文档主体下的所有块级节点
for node in source_doc.first_section.body.get_child_nodes(aw.NodeType.ANY, False):
    # 遇到段落先判断是否为标题
    if node.node_type == aw.NodeType.PARAGRAPH:
        para = node.as_paragraph()
        is_heading = para.paragraph_format.style_identifier == target_heading_style
        if is_heading:
            para_text = para.get_text().strip()
            if para_text == TARGET_CHAPTER_NAME:
                # 匹配到目标章节标题,开始收集内容
                is_collecting = True
            elif is_collecting:
                # 收集过程中遇到同级别/更高级别标题,说明章节结束,终止遍历
                current_heading_level = para.paragraph_format.style_identifier - aw.StyleIdentifier.HEADING_1 + 1
                if current_heading_level <= CHAPTER_HEADING_LEVEL:
                    break
    # 收集状态下将节点导入目标文档,保留源格式
    if is_collecting:
        imported_node = target_doc.import_node(
            node, 
            True, 
            aw.ImportFormatMode.KEEP_SOURCE_FORMATTING
        )
        target_doc.first_section.body.append_child(imported_node)

# 结果处理
if is_collecting:
    target_doc.save(OUTPUT_DOC_PATH)
    print(f"章节「{TARGET_CHAPTER_NAME}」提取完成,文件已保存至{OUTPUT_DOC_PATH}")
else:
    print(f"未在当前文档中找到名为「{TARGET_CHAPTER_NAME}」的目标章节")

使用说明:

  • 如果章节名不需要完全精确匹配(比如存在前后空格、固定前缀+动态编号),可以将代码中的文本精确相等判断替换为正则匹配,适配你的命名规则即可
  • 代码默认完整保留源文档格式,若需要适配新文档的默认样式,可将import_node方法的第三个参数改为aw.ImportFormatMode.USE_DESTINATION_STYLES
  • 若你的章节标题没有使用Word内置标题样式,而是自定义样式,只需将标题判断逻辑替换为匹配自定义样式名称即可
  • 如果源文档中存在跨物理分节的章节,只需将遍历逻辑调整为先遍历所有Section,再遍历每个Section下的Body子节点,核心收集逻辑不变
  • 需要批量提取多份年报、多个Project章节时,只需在外层套文件循环、章节名循环即可,无需调整核心逻辑

内容的提问来源于stack exchange,提问作者Cbotelho

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.01 01:24:34