Python 操作 Word 页眉页脚完整指南

简介: 本文手把手教你用Python(python-docx库)自动为Word文档添加页眉页脚:含公司Logo、保密标识、动态页码、首页/奇偶页差异化设置及批量处理技巧,50页报告1秒搞定,告别手动重复劳动。(239字)


加班到晚上十点,我终于改完了那份50页的季度报告。按下保存,关掉电脑,心里想着明天终于可以交差了。

结果第二天一早,领导说:“小张,报告做得不错,但每页顶部加上公司Logo和保密级别,底部加上页码和日期。”

打开那50页的文档,我愣住了。难不成要一页一页手动加?正当我准备认命时,旁边同事瞥了一眼:“你不会用Python吗?几行代码的事。”
代理 IP 使用小技巧 让你的数据抓取效率翻倍 (43).png

就这样,我踏上了折腾Word页眉页脚的路。

选哪个库?这事儿得说清楚
Python操作Word主要有两大家族:python-docx和Aspose.Words。前者免费开源,后者是商业产品但功能更强。

免费的真香。python-docx虽然有些地方需要绕弯路,但应付日常工作绰绰有余。商业版强大但收费,除非你的工作天天跟文档打交道,否则先别急着掏钱。

安装也很简单:

pip install python-docx

搞定。我们从头开始。

页眉页脚在哪里?先找到“节”
Word文档里藏着一个概念叫“节”。每个文档至少有一个节,节下面才有页眉和页脚。这就像找文件得先进文件夹。

from docx import Document

doc = Document()
section = doc.sections[0] # 获取第一个节

拿到节之后,页眉和页脚就暴露了:

header = section.header
footer = section.footer

就这么简单。

往页眉里写点东西
页眉其实就是一个可以放文字、图片的地方。往里面加内容的方式跟正文差不多:

from docx import Document

doc = Document()
section = doc.sections[0]

拿到页眉,加个段落

header = section.header
header_para = header.paragraphs[0] # 默认就有一个段落
header_para.text = "公司机密文件 - 严禁外传"

doc.save("report.docx")

这段代码执行完,打开文档,每页顶部都会出现这行字。

想玩点花样?调整字体和对齐方式:

from docx.shared import Pt
from docx.enum.text import WD_PARAGRAPH_ALIGNMENT

header_para.text = "公司机密文件"
header_para.style.font.size = Pt(12)
header_para.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER

页脚里加个页码
页码比普通文字麻烦一点。python-docx不直接支持自动页码,但可以插入Word的域代码来实现。

from docx.oxml import OxmlElement
from docx.oxml.ns import qn

def add_page_number(paragraph):
"""在段落中插入自动页码"""
run = paragraph.add_run()

# 添加页码域代码
fldChar = OxmlElement('w:fldChar')
fldChar.set(qn('w:fldCharType'), 'begin')
run._r.append(fldChar)

instrText = OxmlElement('w:instrText')
instrText.text = "PAGE"
run._r.append(instrText)

fldChar = OxmlElement('w:fldChar')
fldChar.set(qn('w:fldCharType'), 'end')
run._r.append(fldChar)

使用

footer = section.footer
footer_para = footer.paragraphs[0]
add_page_number(footer_para)

保存文档后,页脚就会显示当前页码。

封面不要页眉?没问题
很多文档要求封面不显示页眉,从第二页开始才需要。这就需要用到“首页不同”的设置。

section = doc.sections[0]
section.different_first_page_header_footer = True

首页页眉(留空或放不同内容)

first_header = section.first_page_header
first_header.paragraphs[0].text = "" # 封面不显示

其他页面的正常页眉

normal_header = section.header
normal_header.paragraphs[0].text = "内部资料"

书籍排版还有个小讲究:奇数页和偶数页的页眉可以不一样。奇数页放章节名,偶数页放书名,打开书的时候左右两侧看起来特别协调。

开启奇偶页不同

section.odd_and_even_pages_header_footer = True

odd_header = section.odd_page_header
odd_header.paragraphs[0].text = "第一章 Python基础"

even_header = section.even_page_header
even_header.paragraphs[0].text = "Python编程指南"

页眉里放个Logo
公司的Logo往页眉一放,文档档次立马不一样。

from docx.shared import Inches

header = section.header
para = header.paragraphs[0]
run = para.add_run()
run.add_picture("logo.png", width=Inches(1.5))

文字跟在图片后面

run = para.add_run(" 某某科技有限公司")

Logo别太大,1到1.5英寸宽就够了。图片路径要写对,不然Word会报错。

文档分节:不同部分不同设置
长文档通常要分节。封面是一节,目录是一节,正文又是一节。每节的页眉页脚可以完全独立。

关键在于打断“链接到前一节”的关系:

获取第二节(索引1)

section2 = doc.sections[1]

断开链接,这样第二节的页眉就可以独立设置了

section2.header.is_linked_to_previous = False
section2.footer.is_linked_to_previous = False

现在可以自由设置第二节的页眉了

section2.header.paragraphs[0].text = "正文部分的页眉"

Word文档操作的核心秘密就在这里:节是独立单位,但默认会继承前一节,想独立就必须断开链接。

批量处理:几十个文档一键搞定
实际工作中经常要处理一堆文档。循环遍历就行了:

import os
from docx import Document

def add_header_to_all(directory, header_text):
"""给目录下所有docx文件添加相同的页眉"""
for filename in os.listdir(directory):
if filename.endswith('.docx'):
filepath = os.path.join(directory, filename)
doc = Document(filepath)

        section = doc.sections[0]
        header = section.header
        header.paragraphs[0].text = header_text

        doc.save(filepath)  # 覆盖保存
        print(f"处理完成: {filename}")

使用

add_header_to_all("./reports", "2024年度报告")

几十个文件几秒钟就搞定了,不用一个个打开。

踩坑提醒
python-docx对已经存在的文档修改页眉时,有个坑要注意。如果文档的页眉以前被设置成“链接到前一节”,修改可能会不生效。解决办法很简单:

section = doc.sections[0]
section.header.is_linked_to_previous = False

先断开,再操作,保证没问题。

还有个常见问题:页码显示不出来怎么办?Word打开后按Ctrl+A全选,再按F9刷新所有域代码,页码就出来了。因为域代码需要手动触发更新。

结语
那50页的报告,我后来用Python跑了不到一秒就全部加好了页眉页脚。领导看了很满意,我也有时间提前下班。

页眉页脚这东西,说白了就是Word给每页加的一个固定区域。Python操作它,核心就是找到“节”,拿到页眉或页脚对象,然后往里面填内容。分节、断开链接、首页不同、奇偶不同,就这几个概念,弄懂了就能应对绝大多数场景。

如果你只是偶尔用,python-docx完全够用。如果要做很复杂的企业级文档自动化,再考虑商业方案也不迟。

代码写完了,记得关电脑下班。

目录
相关文章
|
25天前
|
索引 Python Windows
别再手动调PPT了:用Python批量生成文本框,还能自动排版
小张苦于每周手动制作PPT周报。本文介绍如何用Python库`python-pptx`自动化生成格式统一的周报:从创建文本框、精细控制字体/颜色/对齐,到实现多级列表、模板占位符替换,助运营人员告别重复劳动,5分钟搞定周报。(239字)
171 0
|
XML C# 数据格式
掌握了在Windows平台上查看DLL依赖的方法
掌握了在Windows平台上查看DLL依赖的方法
3908 4
|
4月前
|
分布式计算 监控 安全
国内数据治理厂商推荐(2026年1月最新)
2026年,数据治理成企业刚需。瓴羊Dataphin是阿里云旗下企业级数据治理平台,依托阿里实践,提供全域资产化管理、标准化建模、智能质控、统一指标、细粒度安全及开放集成六大能力,助力企业构建可信、可用、可管的数据资产体系。(239字)
|
8月前
|
数据采集 人工智能 文字识别
《法务RAG开发不踩坑:Kiln+LlamaIndex+Helicone的协同方法指南》
本文记录企业级法务知识库RAG系统的多AI协同开发实战:面对2万份格式混杂、含15%模糊扫描件的法律文档,14天交付需3秒响应精准查询的系统,构建Kiln AI、LlamaIndex、Helicone协同矩阵。Kiln AI完成数据清洗(有效信息密度提至85%)、合成训练样本及模型微调,使专业术语识别准确率达92%;LlamaIndex搭建三层检索架构,融合语义与关键词检索,匹配错误率降至5%,响应时间缩至2.1秒;Helicone优化提示词与推理监控,输出规范率达97%。
491 3
|
10月前
|
存储 安全 数据处理
探讨对称加密与非对称加密的区别
综上所述,对称加密和非对称加密的选用取决于不同的安全需求、性能考量和应用情境。了解各自的特点和限制,才能有效地部署合理的加密策略,以确保数据通信的安全性和效率。
1126 13
|
开发工具 git
git如何修改提交代码时的名字和邮箱?
git如何修改提交代码时的名字和邮箱?
6447 4
【Qt 学习笔记】Qt窗口 | 标准对话框 | 消息对话框QMessageBox
【Qt 学习笔记】Qt窗口 | 标准对话框 | 消息对话框QMessageBox
2578 4
【Qt 学习笔记】Qt窗口 | 标准对话框 | 消息对话框QMessageBox
|
机器学习/深度学习 自然语言处理 搜索推荐
一文掌握jieba分词器的常见用法,附带案例
该文章全面介绍了jieba分词器的使用方法,包括安装步骤、不同分词模式的使用,以及如何通过实例代码进行文本分词处理。
2431 0
|
运维 前端开发 Oracle
再有人问你WebSocket为什么牛逼,就把这篇文章发给他!
再有人问你WebSocket为什么牛逼,就把这篇文章发给他!2008年6月诞生了一个影响计算机世界的通信协议,原先需要二十台计算机资源才能支撑的业务场景,现在只需要一台,这得帮"抠门"老板们省下多少钱,它就是大名鼎鼎的WebSocket协议。很快在下一年也就是2009年的12月,Google浏览器就宣布成为第一个支持WebSocket标准的浏览器。WebSocket的推动者和设计者就是下面的Michael Carter,他设计的WebSocket协议技术现在每天在全地球有超过的设备在使用。
668 1
再有人问你WebSocket为什么牛逼,就把这篇文章发给他!
|
安全 机器人 程序员
Windows 计划任务每天隔 3 小时运行一次批处理文件详细配置步骤
Windows 计划任务每天隔 3 小时运行一次批处理文件详细配置步骤
3325 2

热门文章

最新文章