使用Python輕松管理Word節(jié)及頁面布局設(shè)置
?小李盯著剛寫完的80頁項目報告,眉頭擰成一團。前面的章節(jié)都是標(biāo)準(zhǔn)縱向排版,但中間有兩張數(shù)據(jù)表實在太寬,放在縱向頁面里,字小得得拿放大鏡看。他試過把這兩頁改成橫向,結(jié)果整個文檔都跟著轉(zhuǎn)了,完全亂套。
這其實是Word里一個特別經(jīng)典的問題。大部分人都在“頁面布局”里點來點去,改了一頁,后面全跟著變,氣得想摔鼠標(biāo)。秘密就藏在Word的一個核心概念里——節(jié)(Section)。
一、你以前的操作,問題出在哪
新建一個Word文檔時,它只有一個“節(jié)”。你可以把“節(jié)”想象成一個容器,這個容器里裝著幾頁紙,這幾頁紙的頁邊距、紙張方向、頁眉頁腳全都一樣。平時在一份文檔里隨便改設(shè)置,改的就是整個容器。把第二頁改成橫向,相當(dāng)于把這個唯一的容器整個翻轉(zhuǎn)了,后面的頁面當(dāng)然跟著亂套。
想要中間幾頁與眾不同,就得在特殊頁面的前后“切一刀”,制造出新的容器。有了三個獨立的容器(節(jié)),你改中間那個,兩頭的不會受影響。
二、用Python看見“節(jié)”
紙上談兵沒意思,直接上手操作。python-docx就是干這活的利器。
from docx import Document
# 打開小李的報告
doc = Document('項目報告.docx')
# 看看這個文檔里有多少個“容器”(節(jié))
print(len(doc.sections)) # 不出意外,打印出來是 1
# 拿到第一個(也是唯一的)節(jié)
first_section = doc.sections[0]
這段代碼就像給文檔做了個CT掃描。文檔結(jié)構(gòu)一目了然。默認(rèn)情況下,你永遠(yuǎn)只有一個節(jié),也就是doc.sections[0]。
三、在你想分頁的地方,“切”上一刀
小李需要在第3頁后面 插入一個橫向的大表格。這意味著要在第3頁結(jié)束的地方,切出一個新節(jié)。
from docx import Document
from docx.enum.section import WD_SECTION_START
doc = Document('項目_report.docx')
# 假設(shè)文檔已經(jīng)有3頁內(nèi)容了,我們在這后面創(chuàng)建新節(jié)
# 注意:add_section() 是在文檔末尾追加新節(jié)
# 如果你想在中間插入,邏輯稍微不同,但核心是下面這行
new_section = doc.add_section(WD_SECTION_START.NEW_PAGE)
# 此時,doc.sections 的長度變成了 2
# sections[0] 是原來的第一頁到第三頁
# sections[1] 就是我們新建的空節(jié),從新的一頁開始
add_section()就像一把刀,在文檔末尾切出一個獨立的新空間。WD_SECTION_START.NEW_PAGE的意思是,切完之后,新節(jié)的內(nèi)容從新的一頁開始。
四、給新節(jié)“換衣服”
現(xiàn)在有了獨立的容器(第二節(jié)),怎么改它的設(shè)置都不會影響前面的內(nèi)容。
# 獲取第二個節(jié)(索引為1)
target_section = doc.sections[1]
from docx.enum.section import WD_ORIENTATION
from docx.shared import Inches
# 獲取當(dāng)前紙張的寬高,準(zhǔn)備交換(縱向變橫向)
original_width = target_section.page_width
original_height = target_section.page_height
# 設(shè)置方向為橫向
target_section.orientation = WD_ORIENTATION.LANDSCAPE
# 交換寬高
target_section.page_width = original_height
target_section.page_height = original_width
# 再把頁邊距調(diào)窄一點,給大表格騰地方
target_section.left_margin = Inches(0.5)
target_section.right_margin = Inches(0.5)
doc.save('項目_report_已排版.docx')
執(zhí)行完這段代碼,文檔中間的這幾頁就神奇地變成了橫向,前后的縱向排版紋絲不動。這就是“節(jié)”的魔力。
五、頁眉頁腳的獨立王國
更頭疼的是頁眉頁腳。公司要求封面不能有頁碼,目錄要用羅馬數(shù)字,正文要用阿拉伯?dāng)?shù)字從“1”開始。
原理一模一樣:每個“節(jié)”的頁眉頁腳默認(rèn)是“鏈接到前一節(jié)”的。想要獨立,得先“斷開關(guān)聯(lián)”。
# 假設(shè)現(xiàn)在有3個節(jié):封面節(jié)、目錄節(jié)、正文節(jié) # 我們操作第三節(jié)(正文)的頁腳 third_section = doc.sections[2] # 關(guān)鍵一步:斷開與前一節(jié)(目錄)的鏈接 third_section.footer.is_linked_to_previous = False # 現(xiàn)在可以放心設(shè)置正文的頁碼了 # 注意:設(shè)置頁碼格式涉及到操作頁腳里的域代碼 footer = third_section.footer # ... 在這里添加頁碼并設(shè)置起始為1
拿到第三節(jié)的頁腳后,執(zhí)行is_linked_to_previous = False,這根“臍帶”就被剪斷了。從此以后,正文節(jié)的頁碼跟目錄節(jié)的頁碼再也沒關(guān)系,各走各的。
還有一個常用功能是“首頁不同”。有的章節(jié)開頭那一頁不想顯示頁眉,這個設(shè)置也是掛在“節(jié)”下面的。
section = doc.sections[0] section.different_first_page_header_footer = True # 單獨設(shè)置首頁頁眉 first_page_header = section.first_page_header first_page_header.paragraphs[0].text = "封面不留頁眉" # 其他頁面的正常頁眉 other_pages_header = section.header other_pages_header.paragraphs[0].text = "內(nèi)部資料"
打開different_first_page_header_footer開關(guān)后,Word就會把這個節(jié)的首頁和其他頁分開對待,你可以分別往里面填內(nèi)容。
六、批量修改,降維打擊
學(xué)會了控制“節(jié)”,能玩的花樣就多了。比如公司換了新logo,要批量給幾百份標(biāo)書統(tǒng)一加上“機密”水印和頁眉。
import os
from docx import Document
folder_path = './reports/'
for filename in os.listdir(folder_path):
if filename.endswith('.docx'):
doc = Document(os.path.join(folder_path, filename))
# 遍歷每一個節(jié)
for section in doc.sections:
# 強制斷開頁眉鏈接,防止有些文檔設(shè)置過特殊屬性
section.header.is_linked_to_previous = False
header = section.header
# 清空原來的頁眉
header.paragraphs[0].clear()
# 寫入新內(nèi)容
header.paragraphs[0].text = "XX集團 絕密文件"
doc.save(os.path.join(folder_path, 'new_' + filename))
一個循環(huán),遍歷所有節(jié),幾秒鐘完成幾百個文件的手工活兒。
七、把大象放進(jìn)冰箱
回過頭看小李遇到的麻煩。把Word里的一頁單獨改變布局,就像把大象放進(jìn)冰箱,也是分三步:
- 打開冰箱門:用
sections屬性看到文檔的結(jié)構(gòu)。 - 把大象放進(jìn)去:用
add_section()在目標(biāo)位置切出新的節(jié)。 - 把冰箱門關(guān)上:修改新節(jié)的
orientation、margin等屬性。
理解了“節(jié)”這個概念,Word自動化的大門才算真正推開了。頁眉頁腳、頁碼格式、分欄布局,全都建立在這個基礎(chǔ)上。以后遇到再復(fù)雜的排版需求,心里就有底了——無非就是切幾刀,改幾個參數(shù)的事。
這份技能在手里,不管是一份80頁的報告,還是800頁的標(biāo)書,用Python管理起來都格外輕松。
?以上就是使用Python輕松管理Word節(jié)及頁面布局設(shè)置的詳細(xì)內(nèi)容,更多關(guān)于Python管理Word節(jié)和頁面布局的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Python小整數(shù)對象池和字符串intern實例解析
這篇文章主要介紹了Python小整數(shù)對象池和字符串intern實例解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-03-03
Python實現(xiàn)Web請求與響應(yīng)的教學(xué)指南
Web?請求與響應(yīng)是?Web?通信的基礎(chǔ),其中?Web?請求由客戶端發(fā)起,服務(wù)器處理后返回響應(yīng),本文主要介紹了Python實現(xiàn)Web請求與響應(yīng)的相關(guān)知識,有需要的可以了解下2025-05-05
python3+PyQt5重新實現(xiàn)QT事件處理程序
這篇文章主要為大家詳細(xì)介紹了python3+PyQt5重新實現(xiàn)QT事件處理程序,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-04-04
Django通過自定義認(rèn)證后端實現(xiàn)多種登錄方式驗證
Django提供了用戶認(rèn)證系統(tǒng),那么如何在項目中進(jìn)行應(yīng)用呢?在本文中小編將給大家介紹如何使用用戶認(rèn)證系統(tǒng),實現(xiàn)我們業(yè)務(wù)場景中常見的多種登錄方式驗證。感興趣的小伙伴可以了解一下2021-12-12

