使用Python實現(xiàn)Word文檔文本格式化的完整指南
?周一早上九點,你打開電腦,發(fā)現(xiàn)領(lǐng)導(dǎo)昨晚十一點發(fā)來的消息:“小張,幫我把這份合同里所有的公司名稱改成加粗紅色,五十頁那個,今天開會要用。”
你打開文檔,翻到第一頁,選中公司名,點加粗,點紅色,然后滾到下一頁。五十頁的文檔,光滾動就花了五分鐘。你揉了揉眼睛,心想這要是每個月都來這么一次,眼睛遲早要廢。
這種機械化的Word排版工作,最適合交給Python。python-docx這個庫,就是專門干這個的。
先搞清楚Word文檔的“三層結(jié)構(gòu)”
在用python-docx之前,得先理解一個概念:Word文檔的文本不是一整塊,而是分了三層。
最外層是Document,代表整個文檔。往下一層是Paragraph,也就是段落。再往下是Run,這才是真正存放文字的地方。
為什么要有Run這個概念?因為一個段落里可能有好幾種不同的格式。比如“這是加粗的文字”這句話,實際上被分成了三個Run:第一個Run是“這是”,第二個Run是“加粗”(帶加粗屬性),第三個Run是“的文字”。每個Run可以單獨設(shè)置字體、大小、顏色。
理解這個結(jié)構(gòu),后面的所有操作就好辦了——想改格式,就要找到對應(yīng)的Run,而不是直接改段落。
環(huán)境準備
先裝庫:
pip install python-docx
在代碼里導(dǎo)入的時候,用docx這個名字,不是python-docx:
from docx import Document from docx.shared import Pt, RGBColor from docx.enum.text import WD_ALIGN_PARAGRAPH
shared里面是尺寸和顏色相關(guān)的工具,enum.text里是對齊方式之類的常量。
讀取現(xiàn)有文檔
假設(shè)你要處理的是那份五十頁的合同:
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加粗標紅,那整句話都變了。你只想要“某某科技有限公司”這個關(guān)鍵詞變色。
解決辦法是把run拆開:
for para in doc.paragraphs:
for run in para.runs:
if target in run.text:
# 獲取run的原始格式
original_text = run.text
# 按目標關(guān)鍵詞拆分
parts = original_text.split(target)
# 清空當(dāng)前run
run.text = parts[0]
# 插入目標關(guān)鍵詞,帶新格式
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])
# 復(fù)制原格式
remaining_run.font.size = run.font.size
remaining_run.font.name = run.font.name
這個邏輯稍微有點繞,但核心思路就是:找到關(guān)鍵詞,把run拆成三段,中間那段單獨設(shè)格式。
改段落:對齊、行距、縮進
有時候你需要改的不是某個詞,而是整個段落的樣式。比如把某些段落居中對齊。
from docx.enum.text import WD_ALIGN_PARAGRAPH
for para in doc.paragraphs:
if '重要提示' in para.text:
para.alignment = WD_ALIGN_PARAGRAPH.CENTER
行距和段間距也可以調(diào)。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可以直接通過樣式名來設(shè)置:
# 添加一個新標題
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)
中文字體的問題
默認情況下,設(shè)置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就是指定東亞字體的那個屬性。這個寫法有點繞,但好在可以封裝成一個函數(shù):
def set_chinese_font(run, font_name):
run.font.name = font_name
run._element.rPr.rFonts.set(qn('w:eastAsia'), font_name)
批量處理多個文檔
如果不止一份合同要改,而是整個文件夾的文檔都需要統(tǒng)一格式:
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)
# 在這里執(zhí)行你的格式化操作
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')
建議另存為新文件,萬一改錯了還能回去找原版。
回到那個周一早上的場景。如果你用上面的代碼跑一遍,五十頁的合同大概只需要兩秒鐘。加粗、標紅、調(diào)字號、改標題樣式,一氣呵成。剩下的時間,你可以安心喝杯咖啡,而不是在文檔里反復(fù)滾動鼠標。
python-docx不能幫你寫報告,但至少能讓你不用再做那些重復(fù)的點鼠標動作。這大概是它最值錢的地方。
到此這篇關(guān)于使用Python實現(xiàn)Word文檔文本格式化的完整指南的文章就介紹到這了,更多相關(guān)Python Word文本格式化內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
淺談python print(xx, flush = True) 全網(wǎng)最清晰的解釋
今天小編就為大家分享一篇淺談python print(xx, flush = True) 全網(wǎng)最清晰的解釋,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-02-02
Scrapy之爬取結(jié)果導(dǎo)出為Excel的實現(xiàn)過程
這篇文章主要介紹了Scrapy之爬取結(jié)果導(dǎo)出為Excel的實現(xiàn)過程,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-12-12
python+selenium+chromedriver實現(xiàn)爬蟲示例代碼
這篇文章主要介紹了python+selenium+chromedriver實現(xiàn)爬蟲示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-04-04
pandas時間序列之pd.to_datetime()的實現(xiàn)
本文主要介紹了pandas時間序列之pd.to_datetime()的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧<BR>2022-06-06
python pandas dataframe 行列選擇,切片操作方法
下面小編就為大家分享一篇python pandas dataframe 行列選擇,切片操作方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-04-04
解決python腳本中error: unrecognized arguments: True錯誤
這篇文章主要介紹了解決python腳本中error: unrecognized arguments: True錯誤,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-04-04
python使用matplotlib定制繪圖的線型、標記類型
這篇文章主要給大家詳細介紹了python使用matplotlib定制繪圖的線型、標記類型,文中有詳細的代碼示例,具有一定的參考價值,需要的朋友可以參考下2023-07-07

