Python實(shí)現(xiàn)Word文檔自動(dòng)化排版的完整流程
一、核心工具準(zhǔn)備
Python處理Word自動(dòng)化排版的核心庫是python-docx,先完成環(huán)境安裝:
# 安裝python-docx庫(僅支持.docx格式,不支持老舊.doc格式) pip install python-docx
python-docx的核心能力:
- 控制字體、字號(hào)、顏色、加粗/斜體等字符樣式;
- 調(diào)整段落間距、對(duì)齊方式、縮進(jìn)等段落格式;
- 美化表格(邊框、對(duì)齊、單元格合并);
- 設(shè)置頁眉頁腳、頁碼、文檔布局(頁邊距、紙張大?。?。
二、Word自動(dòng)化排版完整流程(實(shí)戰(zhàn)案例)
以“員工手冊(cè).docx”為例(原始文檔為無格式的純文本),按“基礎(chǔ)樣式→段落排版→表格美化→頁面布局→頁眉頁腳”的邏輯完成自動(dòng)化排版。
步驟1:加載Word文檔并初始化基礎(chǔ)設(shè)置
先讀取原始文檔,配置全局字體(解決中文顯示問題),為后續(xù)排版打下基礎(chǔ):
from docx import Document
from docx.shared import Pt, Inches, RGBColor
from docx.enum.text import WD_PARAGRAPH_ALIGNMENT
from docx.enum.table import WD_TABLE_ALIGNMENT
from docx.oxml.ns import qn
# 1. 加載原始Word文檔(或創(chuàng)建新文檔:doc = Document())
doc = Document("員工手冊(cè)_原始.docx")
# 2. 設(shè)置文檔全局字體(關(guān)鍵:解決中文顯示異常)
# 全局默認(rèn)樣式:微軟雅黑、小四(12磅)、黑色
normal_style = doc.styles['Normal']
normal_style.font.name = '微軟雅黑' # 西文字體
normal_style._element.rPr.rFonts.set(qn('w:eastAsia'), '微軟雅黑') # 中文字體
normal_style.font.size = Pt(12)
normal_style.font.color.rgb = RGBColor(0, 0, 0) # 黑色
print("文檔加載并完成全局字體初始化!")
步驟2:字符樣式自動(dòng)化排版(字體、字號(hào)、顏色)
針對(duì)標(biāo)題、正文、強(qiáng)調(diào)文本等不同字符類型,批量設(shè)置統(tǒng)一樣式,替代手動(dòng)選中文本調(diào)整格式:
# 定義樣式配置函數(shù)(復(fù)用性更高)
def set_char_style(run, font_name='微軟雅黑', font_size=12, bold=False, italic=False, color=RGBColor(0,0,0)):
"""
配置字符樣式
:param run: 字符運(yùn)行對(duì)象(docx.text.run.Run)
:param font_name: 字體名稱
:param font_size: 字號(hào)(磅)
:param bold: 是否加粗
:param italic: 是否斜體
:param color: 字體顏色(RGBColor)
"""
run.font.name = font_name
run._element.rPr.rFonts.set(qn('w:eastAsia'), font_name)
run.font.size = Pt(font_size)
run.font.bold = bold
run.font.italic = italic
run.font.color.rgb = color
# 1. 批量設(shè)置標(biāo)題樣式(文檔中前3個(gè)段落為一級(jí)/二級(jí)/三級(jí)標(biāo)題)
# 一級(jí)標(biāo)題:二號(hào)字、加粗、居中、深藍(lán)色
title1 = doc.paragraphs[0].runs[0]
set_char_style(title1, font_size=22, bold=True, color=RGBColor(0, 51, 102))
doc.paragraphs[0].alignment = WD_PARAGRAPH_ALIGNMENT.CENTER
# 二級(jí)標(biāo)題:小三號(hào)字、加粗、左對(duì)齊、深藍(lán)色
title2 = doc.paragraphs[1].runs[0]
set_char_style(title2, font_size=15, bold=True, color=RGBColor(0, 51, 102))
doc.paragraphs[1].alignment = WD_PARAGRAPH_ALIGNMENT.LEFT
# 三級(jí)標(biāo)題:小四號(hào)字、加粗、左對(duì)齊、深灰色
title3 = doc.paragraphs[2].runs[0]
set_char_style(title3, font_size=12, bold=True, color=RGBColor(51, 51, 51))
doc.paragraphs[2].alignment = WD_PARAGRAPH_ALIGNMENT.LEFT
# 2. 批量設(shè)置正文強(qiáng)調(diào)文本(如“注意:”“警告:”標(biāo)紅加粗)
for para in doc.paragraphs:
for run in para.runs:
if "注意:" in run.text:
set_char_style(run, bold=True, color=RGBColor(255, 0, 0))
elif "警告:" in run.text:
set_char_style(run, bold=True, color=RGBColor(255, 102, 0))
print("字符樣式排版完成!")
步驟3:段落格式自動(dòng)化排版(間距、縮進(jìn)、對(duì)齊)
調(diào)整段落的行間距、段前段后間距、首行縮進(jìn)等,解決手動(dòng)調(diào)整段落格式的繁瑣:
# 定義段落樣式配置函數(shù)
def set_para_style(para, line_spacing=1.5, space_before=0, space_after=5, indent=2):
"""
配置段落樣式
:param para: 段落對(duì)象(docx.text.paragraph.Paragraph)
:param line_spacing: 行間距(倍)
:param space_before: 段前間距(磅)
:param space_after: 段后間距(磅)
:param indent: 首行縮進(jìn)(字符數(shù))
"""
# 行間距
para.paragraph_format.line_spacing = line_spacing
# 段前/段后間距(磅)
para.paragraph_format.space_before = Pt(space_before)
para.paragraph_format.space_after = Pt(space_after)
# 首行縮進(jìn)(2字符,需轉(zhuǎn)換為磅,1字符≈12磅)
para.paragraph_format.first_line_indent = Pt(indent * 12)
# 1. 批量設(shè)置正文段落格式(跳過前3個(gè)標(biāo)題段落)
for i, para in enumerate(doc.paragraphs):
if i >= 3: # 標(biāo)題段落已單獨(dú)設(shè)置,僅處理正文
set_para_style(
para,
line_spacing=1.5, # 1.5倍行間距
space_before=0, # 段前0磅
space_after=5, # 段后5磅
indent=2 # 首行縮進(jìn)2字符
)
# 2. 單獨(dú)調(diào)整標(biāo)題段落的間距
doc.paragraphs[0].paragraph_format.space_after = Pt(15) # 一級(jí)標(biāo)題段后15磅
doc.paragraphs[1].paragraph_format.space_after = Pt(10) # 二級(jí)標(biāo)題段后10磅
doc.paragraphs[2].paragraph_format.space_after = Pt(8) # 三級(jí)標(biāo)題段后8磅
print("段落格式排版完成!")
步驟4:表格自動(dòng)化美化(邊框、對(duì)齊、單元格格式)
Word中的表格常需手動(dòng)調(diào)整邊框、單元格對(duì)齊、列寬,通過代碼批量美化:
# 遍歷文檔中所有表格,統(tǒng)一美化
for table in doc.tables:
# 1. 表格整體樣式:居中對(duì)齊、顯示邊框
table.alignment = WD_TABLE_ALIGNMENT.CENTER
table.style = 'Table Grid' # 顯示完整邊框(內(nèi)置樣式)
# 2. 設(shè)置表頭樣式(第一行)
for cell in table.rows[0].cells:
# 表頭文字:加粗、居中、淺藍(lán)色背景
for para in cell.paragraphs:
para.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER
for run in para.runs:
set_char_style(run, bold=True, color=RGBColor(0, 51, 102))
# 單元格背景色(淺藍(lán)色)
cell.fill.color.rgb = RGBColor(230, 243, 255)
# 3. 設(shè)置正文行樣式:文字居中、調(diào)整列寬
for row in table.rows[1:]:
for i, cell in enumerate(row.cells):
# 單元格文字居中
for para in cell.paragraphs:
para.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER
# 按列調(diào)整寬度(第1列2英寸,其余1.5英寸)
cell.width = Inches(2) if i == 0 else Inches(1.5)
print("表格美化完成!")
步驟5:頁面布局與頁眉頁腳自動(dòng)化設(shè)置
配置頁邊距、紙張大小、頁碼、頁眉等頁面級(jí)格式,替代手動(dòng)調(diào)整“頁面布局”和“插入頁眉頁腳”:
from docx.enum.section import WD_ORIENTATION
from docx.enum.text import WD_ALIGN_PARAGRAPH
# 1. 設(shè)置頁面布局(A4紙張、頁邊距)
section = doc.sections[0]
section.page_width = Inches(8.27) # A4寬度
section.page_height = Inches(11.69) # A4高度
# 設(shè)置頁邊距(上2.54cm,下2.54cm,左3cm,右2.5cm)
section.top_margin = Inches(1) # 1英寸≈2.54cm
section.bottom_margin = Inches(1)
section.left_margin = Inches(1.18)
section.right_margin = Inches(0.98)
# 2. 設(shè)置頁眉(文檔名稱+分隔線)
header = section.header
header_para = header.paragraphs[0]
header_para.text = "XX公司員工手冊(cè) - 標(biāo)準(zhǔn)化文檔"
header_para.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER
# 頁眉文字樣式:小五號(hào)字、灰色
for run in header_para.runs:
set_char_style(run, font_size=10.5, color=RGBColor(102, 102, 102))
# 3. 設(shè)置頁腳(頁碼+日期)
footer = section.footer
# 頁碼段落(居中)
footer_para1 = footer.paragraphs[0]
footer_para1.text = "第 {PAGE} 頁,共 {NUMPAGES} 頁"
footer_para1.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER
# 日期段落(右對(duì)齊)
footer_para2 = footer.add_paragraph("2025年01月01日")
footer_para2.alignment = WD_PARAGRAPH_ALIGNMENT.RIGHT
for run in footer_para2.runs:
set_char_style(run, font_size=10.5)
print("頁面布局與頁眉頁腳設(shè)置完成!")
步驟6:保存排版后的文檔
# 保存排版后的文檔
doc.save("員工手冊(cè)_排版完成.docx")
print("Word文檔自動(dòng)化排版完成,已保存為「員工手冊(cè)_排版完成.docx」!")
三、高頻排版場(chǎng)景拓展
場(chǎng)景1:批量排版多份Word文檔
若有多個(gè)同類型文檔(如各部門的報(bào)告),可遍歷文件夾批量應(yīng)用排版規(guī)則:
import os
# 定義排版函數(shù)(復(fù)用上述所有邏輯)
def format_word(file_path, output_path):
doc = Document(file_path)
# 1. 全局字體設(shè)置(省略,同步驟1)
# 2. 字符樣式設(shè)置(省略,同步驟2)
# 3. 段落格式設(shè)置(省略,同步驟3)
# 4. 表格美化(省略,同步驟4)
# 5. 頁面布局(省略,同步驟5)
doc.save(output_path)
# 遍歷文件夾中的Word文檔
input_folder = "待排版文檔"
output_folder = "排版完成文檔"
if not os.path.exists(output_folder):
os.mkdir(output_folder)
for file_name in os.listdir(input_folder):
if file_name.endswith(".docx"):
input_path = os.path.join(input_folder, file_name)
output_path = os.path.join(output_folder, file_name.replace(".docx", "_排版完成.docx"))
format_word(input_path, output_path)
print("多份Word文檔批量排版完成!")
場(chǎng)景2:按模板批量生成并排版文檔
結(jié)合Excel數(shù)據(jù)源,批量生成帶標(biāo)準(zhǔn)化排版的Word文檔(如員工通知書):
import pandas as pd
# 讀取Excel中的員工數(shù)據(jù)
df = pd.read_excel("員工信息.xlsx")
for index, row in df.iterrows():
# 創(chuàng)建新文檔
doc = Document()
# 1. 設(shè)置全局字體
normal_style = doc.styles['Normal']
normal_style.font.name = '微軟雅黑'
normal_style._element.rPr.rFonts.set(qn('w:eastAsia'), '微軟雅黑')
# 2. 添加標(biāo)題并排版
title = doc.add_heading(f'{row["姓名"]}的轉(zhuǎn)正通知書', level=0)
title.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER
set_char_style(title.runs[0], font_size=22, bold=True)
# 3. 添加正文并排版
para = doc.add_paragraph(f'尊敬的{row["姓名"]}:您于{row["入職日期"]}入職,現(xiàn)正式轉(zhuǎn)正。')
set_para_style(para, indent=2)
# 4. 添加表格并美化(省略,同步驟4)
# 5. 保存文檔
doc.save(f'轉(zhuǎn)正通知書_{row["姓名"]}.docx')
print("批量生成并排版Word文檔完成!")
四、常見問題與解決方法
1.中文字體顯示異常:必須同時(shí)設(shè)置font.name(西文)和eastAsia(中文)字體,缺一不可:
run.font.name = '微軟雅黑'
run._element.rPr.rFonts.set(qn('w:eastAsia'), '微軟雅黑')
2.行間距設(shè)置無效:line_spacing支持多種格式,建議用“倍數(shù)”或固定值:
para.paragraph_format.line_spacing = Pt(20) # 固定20磅行間距 para.paragraph_format.line_spacing = 1.5 # 1.5倍行間距
3.表格邊框不顯示:需指定內(nèi)置表格樣式,而非僅設(shè)置單元格邊框:
table.style = 'Table Grid' # 顯示完整邊框
4.頁碼占位符不生效:{PAGE} {NUMPAGES}是Word域代碼,需保存后在Word中更新域:
- 手動(dòng)更新:選中頁碼 → 右鍵 → 更新域;
- 自動(dòng)更新:可結(jié)合
win32com庫(需額外安裝pywin32)。
5.段落縮進(jìn)計(jì)算錯(cuò)誤:1個(gè)中文字符≈12磅,首行縮進(jìn)2字符需設(shè)置為Pt(24):
para.paragraph_format.first_line_indent = Pt(2 * 12)
以上就是Python實(shí)現(xiàn)Word文檔自動(dòng)化排版的完整流程的詳細(xì)內(nèi)容,更多關(guān)于Python Word自動(dòng)化排版的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
基于Python?+?PyQt搭建可視化頁面的詳細(xì)教程
PyQt是一個(gè)Python綁定庫,它是基于Qt庫的,PyQt提供了一整套豐富的組件,包括窗口、按鈕、菜單、列表框等,以及事件處理、布局管理、網(wǎng)絡(luò)通信等多種功能,本文介紹了基于Python?+?PyQt搭建可視化頁面的詳細(xì)教程,需要的朋友可以參考下2024-07-07
Python使用Tkinter+openpyxl處理Excel文件并顯示實(shí)時(shí)進(jìn)度條
在項(xiàng)目開發(fā)或數(shù)據(jù)處理中,經(jīng)常需要批量處理 Excel 文件,本文將分析如何使用 openpyxl 正確處理合并單元格并將單元格轉(zhuǎn)為字符串,同時(shí)結(jié)合 Tkinter 實(shí)現(xiàn)帶進(jìn)度條的圖形界面實(shí)時(shí)顯示處理進(jìn)度,感興趣的小伙伴可以了解下2026-01-01
python數(shù)字圖像處理之圖像自動(dòng)閾值分割示例
這篇文章主要為大家介紹了python數(shù)字圖像處理之圖像自動(dòng)閾值分割示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06
Python+Opencv實(shí)現(xiàn)圖像匹配功能(模板匹配)
這篇文章主要為大家詳細(xì)介紹了Python+Opencv實(shí)現(xiàn)圖像匹配功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-10-10
Python使用get_text()方法從大段html中提取文本的實(shí)例
今天小編就為大家分享一篇Python使用get_text()方法從大段html中提取文本的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-08-08
Python使用Spire.Doc for .NET輕松實(shí)現(xiàn)Word和Markdown互轉(zhuǎn)
在寫作、技術(shù)文檔管理和知識(shí)庫建設(shè)中,Word 和 Markdown 是我們最常打交道的兩種文檔格式,本文將詳細(xì)介紹如何使用 Spire.Doc for .NET 在 Python 環(huán)境中高效實(shí)現(xiàn) Word 與 Markdown 的互轉(zhuǎn),有需要的小伙伴可以了解下2026-06-06
Python利用Beautiful Soup模塊創(chuàng)建對(duì)象詳解
這篇文章主要介紹了Python利用Beautiful Soup模塊創(chuàng)建對(duì)象的相關(guān)資料,文中介紹的非常詳細(xì),相信對(duì)大家具有一定的參考價(jià)值,需要的朋友們下面來一起看看吧。2017-03-03

