You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何用python-docx库复制Word文档带格式内容至另一份文档?

解决python-docx复制Word文本时保留格式的问题

嘿,我完全懂你现在的困扰——用python-docx复制文本时,加粗、斜体、下划线这些格式全丢了,不管是复制纯文本还是直接搬段落对象都不管用对吧?其实问题出在python-docx的文档结构上:每个段落(Paragraph)是由多个Run对象组成的,每个Run才是携带具体格式(字体样式、颜色、粗细等)的最小单元。直接复制段落或者提取文本都会忽略这些Run的格式信息,所以得逐个处理每个Run的内容和样式才行。

下面给你一个完整的实现方案,能完美保留文本的加粗、斜体、下划线、文字颜色,甚至段落的对齐方式、缩进这些格式:

from docx import Document
from docx.shared import RGBColor

def copy_formatted_text(source_path, target_path):
    # 打开源文档和目标文档
    source_doc = Document(source_path)
    target_doc = Document()

    # 遍历源文档的每个段落
    for source_paragraph in source_doc.paragraphs:
        # 在目标文档中创建一个新段落
        target_paragraph = target_doc.add_paragraph()
        
        # 复制段落的格式(对齐方式、缩进等)
        target_paragraph.alignment = source_paragraph.alignment
        target_paragraph.indentation_left = source_paragraph.indentation_left
        target_paragraph.indentation_right = source_paragraph.indentation_right
        target_paragraph.space_before = source_paragraph.space_before
        target_paragraph.space_after = source_paragraph.space_after

        # 遍历源段落中的每个Run(带格式的文本片段)
        for source_run in source_paragraph.runs:
            # 在目标段落中添加一个新的Run
            target_run = target_paragraph.add_run(source_run.text)
            
            # 复制Run的格式属性
            # 基础样式:加粗、斜体、下划线
            target_run.bold = source_run.bold
            target_run.italic = source_run.italic
            target_run.underline = source_run.underline
            
            # 字体颜色
            if source_run.font.color.rgb:
                target_run.font.color.rgb = RGBColor(source_run.font.color.rgb)
            
            # 可选:还可以复制字号、字体名称等其他格式
            target_run.font.size = source_run.font.size
            target_run.font.name = source_run.font.name

    # 保存目标文档
    target_doc.save(target_path)

# 使用示例
copy_formatted_text("源文档.docx", "目标文档.docx")

关键说明:

  • Run对象是核心:Word里的一段文本如果有多种格式(比如“这是加粗斜体的文本”),会被拆分成多个Run,每个Run对应一种格式组合。所以必须逐个处理这些Run才能保留完整格式。
  • 段落格式也要复制:除了文本样式,段落的对齐、缩进、前后间距这些属性也可以通过直接赋值的方式复制,让目标文档和源文档的排版更一致。
  • 扩展格式支持:如果需要复制更多格式(比如删除线、高亮、下标上标),只需要添加对应的属性赋值即可,比如target_run.font.strike = source_run.font.strike

如果之前你尝试直接复制段落对象(比如target_doc.paragraphs.append(source_paragraph)),这种方式是无效的,因为段落对象和它所属的文档是绑定的,不能直接跨文档转移。必须像上面这样,逐个重建段落和Run,并复制对应的属性。

内容的提问来源于stack exchange,提问作者E. Epstein

火山引擎 最新活动