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

张开发
2026/4/15 8:15:26 15 分钟阅读

分享文章

Python 操作 Word 页眉页脚完整指南
加班到晚上十点我终于改完了那份50页的季度报告。按下保存关掉电脑心里想着明天终于可以交差了。结果第二天一早领导说“小张报告做得不错但每页顶部加上公司Logo和保密级别底部加上页码和日期。”打开那50页的文档我愣住了。难不成要一页一页手动加正当我准备认命时旁边同事瞥了一眼“你不会用Python吗几行代码的事。”就这样我踏上了折腾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, widthInches(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打开后按CtrlA全选再按F9刷新所有域代码页码就出来了。因为域代码需要手动触发更新。结语那50页的报告我后来用Python跑了不到一秒就全部加好了页眉页脚。领导看了很满意我也有时间提前下班。页眉页脚这东西说白了就是Word给每页加的一个固定区域。Python操作它核心就是找到“节”拿到页眉或页脚对象然后往里面填内容。分节、断开链接、首页不同、奇偶不同就这几个概念弄懂了就能应对绝大多数场景。如果你只是偶尔用python-docx完全够用。如果要做很复杂的企业级文档自动化再考虑商业方案也不迟。代码写完了记得关电脑下班。

更多文章