如何用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




