使用 Python 实现 Word 文档文本格式化全解析

简介: 周一早九点,领导催改50页合同格式?别再手动滚动了!用Python+python-docx库,2秒自动完成公司名加粗红色、段落对齐、标题样式等批量排版。掌握Document-Paragraph-Run三层结构,轻松搞定Word自动化,解放双手,专注真正重要的事。(239字)


周一早上九点,你打开电脑,发现领导昨晚十一点发来的消息:“小张,帮我把这份合同里所有的公司名称改成加粗红色,五十页那个,今天开会要用。”

你打开文档,翻到第一页,选中公司名,点加粗,点红色,然后滚到下一页。五十页的文档,光滚动就花了五分钟。你揉了揉眼睛,心想这要是每个月都来这么一次,眼睛迟早要废。
代理 IP 使用小技巧 让你的数据抓取效率翻倍 (28).png

这种机械化的Word排版工作,最适合交给Python。python-docx这个库,就是专门干这个的。

先搞清楚Word文档的“三层结构”
在用python-docx之前,得先理解一个概念:Word文档的文本不是一整块,而是分了三层。

最外层是Document,代表整个文档。往下一层是Paragraph,也就是段落。再往下是Run,这才是真正存放文字的地方。

为什么要有Run这个概念?因为一个段落里可能有好几种不同的格式。比如“这是加粗的文字”这句话,实际上被分成了三个Run:第一个Run是“这是”,第二个Run是“加粗”(带加粗属性),第三个Run是“的文字”。每个Run可以单独设置字体、大小、颜色。

理解这个结构,后面的所有操作就好办了——想改格式,就要找到对应的Run,而不是直接改段落。

环境准备
先装库:

pip install python-docx

在代码里导入的时候,用docx这个名字,不是python-docx:

from docx import Document
from docx.shared import Pt, RGBColor
from docx.enum.text import WD_ALIGN_PARAGRAPH

shared里面是尺寸和颜色相关的工具,enum.text里是对齐方式之类的常量。

读取现有文档
假设你要处理的是那份五十页的合同:

doc = Document('合同.docx')

这样就加载进来了。doc.paragraphs里放着所有段落,你可以遍历它们:

for para in doc.paragraphs:
print(para.text)

但只打印文本不够,你要改的是格式。格式藏在每个段落的runs里面:

for para in doc.paragraphs:
for run in para.runs:

    # 在这里操作每个run

改字体:加粗、颜色、大小
回到那个需求:把所有“某某科技有限公司”改成加粗红色。

from docx import Document
from docx.shared import Pt, RGBColor

doc = Document('合同.docx')

target = '某某科技有限公司'

for para in doc.paragraphs:
for run in para.runs:
if target in run.text:

        # 把这个run里的目标文字单独拎出来改格式
        # 注意:如果run里不止目标文字,需要拆开处理
        run.font.bold = True
        run.font.color.rgb = RGBColor(255, 0, 0)  # 红色
        run.font.size = Pt(12)  # 字号,可选

但这里有个坑。如果一个run里是“本合同的乙方为某某科技有限公司,特此声明”,你直接把整个run加粗标红,那整句话都变了。你只想要“某某科技有限公司”这个关键词变色。

解决办法是把run拆开:

for para in doc.paragraphs:
for run in para.runs:
if target in run.text:

        # 获取run的原始格式
        original_text = run.text
        # 按目标关键词拆分
        parts = original_text.split(target)

        # 清空当前run
        run.text = parts[0]

        # 插入目标关键词,带新格式
        new_run = para.add_run(target)
        new_run.font.bold = True
        new_run.font.color.rgb = RGBColor(255, 0, 0)

        # 插入剩下的文本,保留原格式
        if len(parts) > 1:
            remaining_run = para.add_run(parts[1])
            # 复制原格式
            remaining_run.font.size = run.font.size
            remaining_run.font.name = run.font.name

这个逻辑稍微有点绕,但核心思路就是:找到关键词,把run拆成三段,中间那段单独设格式。

改段落:对齐、行距、缩进
有时候你需要改的不是某个词,而是整个段落的样式。比如把某些段落居中对齐。

from docx.enum.text import WD_ALIGN_PARAGRAPH

for para in doc.paragraphs:
if '重要提示' in para.text:
para.alignment = WD_ALIGN_PARAGRAPH.CENTER

行距和段间距也可以调。paragraph_format这个属性管这些:

from docx.shared import Pt

for para in doc.paragraphs:
paragraph_format = para.paragraph_format
paragraph_format.line_spacing = Pt(20) # 行距20磅
paragraph_format.space_before = Pt(12) # 段前距
paragraph_format.space_after = Pt(6) # 段后距

首行缩进是中文文档的常见需求:

from docx.shared import Pt

for para in doc.paragraphs:

# 排除标题等不需要缩进的段落
if len(para.text) > 10 and not para.text.startswith('一、'):
    para.paragraph_format.first_line_indent = Pt(24)  # 两个字符

改标题样式
文档里的标题通常有自己的样式。python-docx可以直接通过样式名来设置:

添加一个新标题

doc.add_heading('第一章 概述', level=1)

但如果要改已有的标题样式,可以这样:

for para in doc.paragraphs:
if para.style.name.startswith('Heading'):

    # 这是标题段落
    for run in para.runs:
        run.font.bold = True
        run.font.size = Pt(16)

中文字体的问题
默认情况下,设置run.font.name = '宋体'可能不生效。因为Word里的中文字体需要用另一个属性指定:

from docx.oxml.ns import qn

run = para.add_run('这是一段中文')
run.font.name = '宋体'
run._element.rPr.rFonts.set(qn('w:eastAsia'), '宋体')

w:eastAsia就是指定东亚字体的那个属性。这个写法有点绕,但好在可以封装成一个函数:

def set_chinese_font(run, font_name):
run.font.name = font_name
run._element.rPr.rFonts.set(qn('w:eastAsia'), font_name)

批量处理多个文档
如果不止一份合同要改,而是整个文件夹的文档都需要统一格式:

import os
from docx import Document

folder = '待处理文档'
output_folder = '处理后文档'

for filename in os.listdir(folder):
if filename.endswith('.docx'):
filepath = os.path.join(folder, filename)
doc = Document(filepath)

    # 在这里执行你的格式化操作
    for para in doc.paragraphs:
        for run in para.runs:
            # 你的逻辑
            pass

    # 另存,避免覆盖原文件
    output_path = os.path.join(output_folder, filename)
    doc.save(output_path)

保存
改完之后,记得保存:

doc.save('合同_已格式化.docx')

建议另存为新文件,万一改错了还能回去找原版。

回到那个周一早上的场景。如果你用上面的代码跑一遍,五十页的合同大概只需要两秒钟。加粗、标红、调字号、改标题样式,一气呵成。剩下的时间,你可以安心喝杯咖啡,而不是在文档里反复滚动鼠标。

python-docx不能帮你写报告,但至少能让你不用再做那些重复的点鼠标动作。这大概是它最值钱的地方。

目录
相关文章
|
4月前
|
数据可视化 前端开发 JavaScript
用Pyecharts绘制交互式中国地图:从数据到可视化全流程解析
Pyecharts是基于ECharts的Python地图可视化利器:支持零代码交互(悬停、缩放)、多级行政区划(省/市/县)、高度定制化(20+样式参数)。本文详解安装配置、数据规范、三步绘图、分段配色、悬停高亮及3D扩展,助你快速生成专业级热力地图。(239字)
672 1
|
JSON 数据挖掘 数据格式
Pandas中Series、DataFrame讲解及操作详解(超详细 附源码)
Pandas中Series、DataFrame讲解及操作详解(超详细 附源码)
1142 1
|
缓存 调度 数据库
Python中的定时器用法:Timer定时器和schedule库
Python中的定时器用法:Timer定时器和schedule库
1599 0
|
Shell
获取image文件, magisk刷机
直接从系统镜像获取image文件, 用于magisk刷机流程中的patch修补流程; 全程使用adb方式,
515 0
|
3月前
|
安全 Linux API
OpenClaw无法联网?一键安装搜索Skill+阿里云/本地部署+千问/Coding Plan配置完整指南
很多用户在部署完OpenClaw(Clawdbot)后都会遇到一个共同问题:**无法联网搜索资料**,让它查询信息、获取新闻、总结网页时,只会回复“做不到”。这并不是OpenClaw不支持联网,而是默认内置的Brave Search、Gemini、Kimi、Perplexity等搜索方式,在国内环境无法直接使用,要么需要API Key,要么访问受限,要么需要付费。
2956 2
|
4月前
|
机器学习/深度学习 传感器 运维
时间序列异常检测的5种方法:从统计阈值到深度学习
时间序列异常检测旨在识别偏离正常规律的数据点,如凌晨流量突增、传感器骤降等。因数据含趋势、季节性与噪声,需结合统计法(Z-Score)、移动平均、季节分解、Isolation Forest或自编码器等方法,多策略融合可有效降低误报。
600 7
时间序列异常检测的5种方法:从统计阈值到深度学习
|
5月前
|
人工智能 文字识别 自然语言处理
智能体来了:行政文员如何应用 AI 进行批量公文处理深度指南
本文深入解析AI智能体在批量公文处理中的核心架构与企业落地路径,涵盖智能解析、合规审查、自动排版分发等全流程。结合LLM语义理解与RPA自动化,实现效率提升超85%,合规检出率达98%。适用于政府、企业数字化转型实践,提供可复用的技术方案与实施指南。(238字)
916 6
|
30天前
|
人工智能 监控 安全
多模态AI(图像+文本)该怎么测试?不是把图片丢给模型这么简单
本文系统阐述多模态AI测试新范式:突破传统文本测试局限,聚焦图像理解、图文对齐、跨模态推理、幻觉防控、安全注入与鲁棒性验证六大核心维度,提出分层模型、六维测试矩阵及自动化评测体系,强调“证据链”验证——答案必须可追溯至图片真实信息。
|
2月前
|
缓存 资源调度 BI
《零成本提升QClaw运行速度,这5招就够了》
本文针对QClaw随使用时长增加逐渐卡顿的普遍痛点,打破“卡顿必升级硬件”的常见误区,指出问题根源在于默认配置不合理与错误使用习惯。作者通过三周系统性实测,总结出五个零成本、立竿见影的性能优化技巧,涵盖模型分层加载、动态上下文裁剪、任务批量合并、本地缓存分级管理与后台进程资源隔离。这些技巧无需额外投入,可让QClaw运行速度直接翻倍,且适用于所有本地运行的智能体工具,为技术从业者提供了可直接落地的通用性能优化方案。
404 9