Python替换docx文件文本时如何保留原有格式?
格式丢失原因
python-docx 中,段落的所有格式(粗体、斜体、字号等)都是绑定在段落内的run对象上的,你直接对paragraph.text整体赋值,会清空该段落下所有原有run,生成一个无格式的新run,自然就丢失了原来的粗体样式。
修复方案
遍历段落内的每一个run,单独对每个run的文本做替换,替换过程中run本身的格式属性会完整保留,原有样式不会丢失。如果你的文档包含表格,也需要单独遍历表格内的文本做同样处理,避免漏替换。
修正后代码
# -*- coding: utf-8 -*- import docx import os def replace_docx_text(from_filename, to_filename, old_value, new_value): doc = docx.Document(from_filename) # 处理正文段落 for paragraph in doc.paragraphs: for run in paragraph.runs: run.text = run.text.replace(old_value, new_value) # 处理表格中的内容,不需要可以删除这部分 for table in doc.tables: for row in table.rows: for cell in row.cells: for paragraph in cell.paragraphs: for run in paragraph.runs: run.text = run.text.replace(old_value, new_value) doc.save(to_filename) if __name__ == '__main__': new_filename = 'result_from_python.docx' # 增加存在性判断,避免首次运行无目标文件时报错 if os.path.exists(new_filename): os.remove(new_filename) replace_docx_text('USA.docx', new_filename, 'а', 'о')
补充说明
如果待替换的字符串刚好跨越了两个相邻的run(比如你好两个字,你是第一个run,好是第二个run,要替换你好这个整体),上述方法会替换失败。这类特殊场景需要先对相邻run的文本做合并判断再处理,普通日常使用场景下,上述代码完全可以满足需求。
内容的提问来源于stack exchange,提问作者Василий Никпуп
相关产品推荐
相关产品推荐

