Python操作Word頁眉頁腳的完整指南
加班到晚上十點,我終于改完了那份50頁的季度報告。按下保存,關(guān)掉電腦,心里想著明天終于可以交差了。
結(jié)果第二天一早,領(lǐng)導(dǎo)說:“小張,報告做得不錯,但每頁頂部加上公司Logo和保密級別,底部加上頁碼和日期。”
打開那50頁的文檔,我愣住了。難不成要一頁一頁手動加?正當(dāng)我準(zhǔn)備認命時,旁邊同事瞥了一眼:“你不會用Python嗎?幾行代碼的事。”
就這樣,我踏上了折騰Word頁眉頁腳的路。
選哪個庫?這事兒得說清楚
Python操作Word主要有兩大家族:python-docx和Aspose.Words。前者免費開源,后者是商業(yè)產(chǎn)品但功能更強。
免費的真香。python-docx雖然有些地方需要繞彎路,但應(yīng)付日常工作綽綽有余。商業(yè)版強大但收費,除非你的工作天天跟文檔打交道,否則先別急著掏錢。
安裝也很簡單:
pip install python-docx
搞定。我們從頭開始。
頁眉頁腳在哪里?先找到“節(jié)”
Word文檔里藏著一個概念叫“節(jié)”。每個文檔至少有一個節(jié),節(jié)下面才有頁眉和頁腳。這就像找文件得先進文件夾。
from docx import Document doc = Document() section = doc.sections[0] # 獲取第一個節(jié)
拿到節(jié)之后,頁眉和頁腳就暴露了:
header = section.header footer = section.footer
就這么簡單。
往頁眉里寫點東西
頁眉其實就是一個可以放文字、圖片的地方。往里面加內(nèi)容的方式跟正文差不多:
from docx import Document
doc = Document()
section = doc.sections[0]
# 拿到頁眉,加個段落
header = section.header
header_para = header.paragraphs[0] # 默認就有一個段落
header_para.text = "公司機密文件 - 嚴(yán)禁外傳"
doc.save("report.docx")
這段代碼執(zhí)行完,打開文檔,每頁頂部都會出現(xiàn)這行字。
想玩點花樣?調(diào)整字體和對齊方式:
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的域代碼來實現(xiàn)。
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)
保存文檔后,頁腳就會顯示當(dāng)前頁碼。
封面不要頁眉?沒問題
很多文檔要求封面不顯示頁眉,從第二頁開始才需要。這就需要用到“首頁不同”的設(shè)置。
section = doc.sections[0] section.different_first_page_header_footer = True # 首頁頁眉(留空或放不同內(nèi)容) first_header = section.first_page_header first_header.paragraphs[0].text = "" # 封面不顯示 # 其他頁面的正常頁眉 normal_header = section.header normal_header.paragraphs[0].text = "內(nèi)部資料"
書籍排版還有個小講究:奇數(shù)頁和偶數(shù)頁的頁眉可以不一樣。奇數(shù)頁放章節(jié)名,偶數(shù)頁放書名,打開書的時候左右兩側(cè)看起來特別協(xié)調(diào)。
# 開啟奇偶頁不同 section.odd_and_even_pages_header_footer = True odd_header = section.odd_page_header odd_header.paragraphs[0].text = "第一章 Python基礎(chǔ)" 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會報錯。
文檔分節(jié):不同部分不同設(shè)置
長文檔通常要分節(jié)。封面是一節(jié),目錄是一節(jié),正文又是一節(jié)。每節(jié)的頁眉頁腳可以完全獨立。
關(guān)鍵在于打斷“鏈接到前一節(jié)”的關(guān)系:
# 獲取第二節(jié)(索引1) section2 = doc.sections[1] # 斷開鏈接,這樣第二節(jié)的頁眉就可以獨立設(shè)置了 section2.header.is_linked_to_previous = False section2.footer.is_linked_to_previous = False # 現(xiàn)在可以自由設(shè)置第二節(jié)的頁眉了 section2.header.paragraphs[0].text = "正文部分的頁眉"
Word文檔操作的核心秘密就在這里:節(jié)是獨立單位,但默認會繼承前一節(jié),想獨立就必須斷開鏈接。
批量處理:幾十個文檔一鍵搞定
實際工作中經(jīng)常要處理一堆文檔。循環(huán)遍歷就行了:
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對已經(jīng)存在的文檔修改頁眉時,有個坑要注意。如果文檔的頁眉以前被設(shè)置成“鏈接到前一節(jié)”,修改可能會不生效。解決辦法很簡單:
section = doc.sections[0] section.header.is_linked_to_previous = False
先斷開,再操作,保證沒問題。
還有個常見問題:頁碼顯示不出來怎么辦?Word打開后按Ctrl+A全選,再按F9刷新所有域代碼,頁碼就出來了。因為域代碼需要手動觸發(fā)更新。
結(jié)語
那50頁的報告,我后來用Python跑了不到一秒就全部加好了頁眉頁腳。領(lǐng)導(dǎo)看了很滿意,我也有時間提前下班。
頁眉頁腳這東西,說白了就是Word給每頁加的一個固定區(qū)域。Python操作它,核心就是找到“節(jié)”,拿到頁眉或頁腳對象,然后往里面填內(nèi)容。分節(jié)、斷開鏈接、首頁不同、奇偶不同,就這幾個概念,弄懂了就能應(yīng)對絕大多數(shù)場景。
如果你只是偶爾用,python-docx完全夠用。如果要做很復(fù)雜的企業(yè)級文檔自動化,再考慮商業(yè)方案也不遲。
代碼寫完了,記得關(guān)電腦下班。
以上就是Python操作Word頁眉頁腳的完整指南的詳細內(nèi)容,更多關(guān)于Python操作Word頁眉頁腳的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Python?Poetry實現(xiàn)高效依賴管理的新手指南
這篇文章主要為大家詳細介紹了Python如何使用Poetry實現(xiàn)高效依賴管理,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2025-05-05
keras和tensorflow使用fit_generator 批次訓(xùn)練操作
這篇文章主要介紹了keras和tensorflow使用fit_generator 批次訓(xùn)練操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-07-07
詳解python定時簡單爬取網(wǎng)頁新聞存入數(shù)據(jù)庫并發(fā)送郵件
這篇文章主要介紹了python定時簡單爬取網(wǎng)頁新聞存入數(shù)據(jù)庫并發(fā)送郵件,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11
Pytorch模型遷移和遷移學(xué)習(xí),導(dǎo)入部分模型參數(shù)的操作
這篇文章主要介紹了Pytorch模型遷移和遷移學(xué)習(xí),導(dǎo)入部分模型參數(shù)的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-03-03

