從入門到精通詳解Python操作Word的實戰(zhàn)指南
1. 為什么需要程序化操作 Word
在很多業(yè)務場景中,我們需要批量生成格式統(tǒng)一的 Word 報告、合同、標書或證書。手動復制粘貼不僅效率低下,還容易出錯。使用 Python 可以:
- 從數(shù)據(jù)庫/Excel 中讀取數(shù)據(jù),動態(tài)填入 Word 模板
- 批量替換文檔中的占位符
- 自動生成結構化的表格和圖表
- 將大量文本信息快速整理成標準排版
- 實現(xiàn)辦公流程自動化,節(jié)省 90% 以上的重復操作時間
Python 操作 Word 的主流庫是 python-docx,它可以在不使用 Microsoft Word 應用程序的情況下創(chuàng)建、修改 .docx 文件,跨平臺且性能優(yōu)越。
2. 環(huán)境準備與庫安裝
確保你的 Python 版本 ≥ 3.7。安裝核心庫:
pip install python-docx # 如果需要轉(zhuǎn) PDF(推薦兩種方式之一) pip install docx2pdf # 跨平臺,但依賴系統(tǒng) Word 或 LibreOffice(Windows/macOS 下常用) pip install pywin32 # 僅 Windows,調(diào)用 MS Word 應用程序
驗證安裝:
import docx print(docx.__version__)
輸出信息:
3. 入門:創(chuàng)建你的第一個 Word 文檔
我們從零開始生成一個文檔,并向其中添加內(nèi)容。
from docx import Document
# 創(chuàng)建一個文檔對象
doc = Document()
# 添加標題 (默認樣式為 'Title')
doc.add_heading('Python Word 操作入門', level=1)
# 添加段落
doc.add_paragraph('這是第一個用 Python 生成的 Word 文檔。')
# 保存文檔
doc.save('01_hello.docx')
print("文檔已生成:01_hello.docx")
輸出信息:
打開生成的文檔,你會看到大標題和一行普通文字。add_paragraph 還可以傳入第二個參數(shù)指定樣式,例如:
doc.add_paragraph('一段重要的提示', style='Intense Quote')
讀取已有文檔
doc = Document('01_hello.docx')
for para in doc.paragraphs:
print(para.text)
輸出信息:
Python Word 操作入門
這是第一個用 Python 生成的 Word 文檔。
關鍵點:
Document()創(chuàng)建一個新文檔,傳入路徑則打開已有文件。paragraphs屬性返回文檔中所有段落對象,text屬性獲取文本。- 標題、列表項等本質(zhì)上也是段落,只是應用了不同的樣式。
4. 段落操作:增刪改查與樣式設置
段落是文檔的基本單元。我們可以精細控制對齊方式、行間距、縮進等。
4.1 段落對齊與間距
from docx import Document
from docx.enum.text import WD_ALIGN_PARAGRAPH
from docx.shared import Pt, Inches
doc = Document()
para1 = doc.add_paragraph('居中對齊的段落')
para1.alignment = WD_ALIGN_PARAGRAPH.CENTER
para2 = doc.add_paragraph('右對齊,行間距 1.5 倍,段前 12 磅, 段后 6 磅。')
para2.alignment = WD_ALIGN_PARAGRAPH.RIGHT
para_format = para2.paragraph_format
para_format.line_spacing = 1.5
para_format.space_before = Pt(12)
para_format.space_after = Pt(6)
para3 = doc.add_paragraph('首行縮進 0.5 英寸的段落。' * 5)
para3.paragraph_format.first_line_indent = Inches(0.5)
doc.save('02_paragraph_format.docx')
print("段落格式示例已生成:02_paragraph_format.docx")
輸出信息:段落格式示例已生成:02_paragraph_format.docx
參數(shù)說明:
WD_ALIGN_PARAGRAPH.LEFT/RIGHT/CENTER/JUSTIFY控制水平對齊。line_spacing可設置為浮點數(shù)(倍數(shù))或具體Pt值(固定值)。space_before/space_after段前段后間距,first_line_indent首行縮進。
4.2 添加換行與分頁
para = doc.add_paragraph('第一行')
para.add_run('\n第二行(在同一個段落中換行)')
doc.add_page_break() # 手動分頁
doc.add_paragraph('新一頁的內(nèi)容')
5. Run 與字體:精細到文字的格式控制
一個段落由多個 Run 對象組成。Run 是相鄰的、具有相同格式的文本塊。通過它,我們可以為同一段落中的不同文字設置不同的字體、顏色、加粗等。
from docx.shared import Pt, RGBColor
from docx import Document
doc = Document()
p = doc.add_paragraph()
# 添加多個 Run
run1 = p.add_run('正常文字 ')
run2 = p.add_run('加粗紅色 ')
run2.bold = True
run2.font.color.rgb = RGBColor(0xFF, 0x00, 0x00)
run2.font.size = Pt(14)
run3 = p.add_run('斜體下劃線')
run3.italic = True
run3.underline = True
run3.font.name = 'Arial'
doc.save('03_run_format.docx')
print("Run 格式示例已生成:03_run_format.docx")
輸出信息:Run 格式示例已生成:03_run_format.docx
常用字體屬性
from docx.shared import Pt
from docx.enum.text import WD_UNDERLINE
run = p.add_run('示例文本')
run.font.name = '黑體'
run.font.size = Pt(12)
run.font.bold = True
run.font.italic = True
run.font.underline = WD_UNDERLINE.DOT_DASH # 點劃線型下劃線
run.font.color.rgb = RGBColor(0, 51, 153)
run.font.highlight_color = WD_COLOR_INDEX.YELLOW # 需導入 WD_COLOR_INDEX
打印 Run 內(nèi)容:
for para in doc.paragraphs:
for run in para.runs:
print(f"文本: {run.text} | 粗體: {run.bold} | 字體: {run.font.name}")
輸出示例:
文本: 正常文字 | 粗體: None | 字體: None
文本: 加粗紅色 | 粗體: True | 字體: 黑體
文本: 斜體下劃線 | 粗體: None | 字體: Arial
注意:未顯式設置字體名稱時,run.font.name 可能返回 None,表示繼承所在樣式。
6. 表格實戰(zhàn):從創(chuàng)建到復雜排版
python-docx 提供了靈活的表格 API,支持創(chuàng)建、合并單元格、設置樣式等。
6.1 創(chuàng)建表格并填充數(shù)據(jù)
doc = Document()
doc.add_heading('員工信息表', level=2)
# 創(chuàng)建 4 行 3 列的表格
table = doc.add_table(rows=4, cols=3, style='Table Grid')
# 表頭
headers = ['姓名', '部門', '工齡']
for i, header in enumerate(headers):
cell = table.cell(0, i)
cell.text = header
# 表頭加粗
for paragraph in cell.paragraphs:
for run in paragraph.runs:
run.bold = True
# 數(shù)據(jù)
data = [
['張三', '研發(fā)部', '3'],
['李四', '市場部', '5'],
['王五', '財務部', '2']
]
for row_idx, row_data in enumerate(data, start=1):
for col_idx, cell_text in enumerate(row_data):
table.cell(row_idx, col_idx).text = cell_text
doc.save('04_table.docx')
print("表格已生成:04_table.docx")
6.2 合并單元格與調(diào)整列寬
# 接上面代碼,在已創(chuàng)建的表格上操作
# 合并第一行的前兩列
a = table.cell(0, 0)
b = table.cell(0, 1)
a.merge(b)
a.text = '基本信息(合并單元格)'
# 設置列寬
from docx.shared import Cm
for cell in table.columns[0].cells:
cell.width = Cm(4)
for cell in table.columns[1].cells:
cell.width = Cm(4)
for cell in table.columns[2].cells:
cell.width = Cm(2)
doc.save('04_table_merged.docx')
print("合并單元格表格已生成")
6.3 逐行添加、刪除行
# 動態(tài)添加行 row = table.add_row() row.cells[0].text = '趙六' row.cells[1].text = '行政部' row.cells[2].text = '1' # 刪除最后一行(如果不需要) # table._tbl.remove(table.rows[-1]._tr) # 內(nèi)部方法,謹慎使用
打印表格內(nèi)容驗證:
for row in table.rows:
for cell in row.cells:
print(cell.text, end='\t')
print()
輸出:
基本信息(合并單元格) 部門 工齡
張三 研發(fā)部 3
李四 市場部 5
王五 財務部 2
趙六 行政部 1
7. 圖片與超鏈接:讓文檔圖文并茂
7.1 插入圖片并控制尺寸
from docx.shared import Inches
doc = Document()
doc.add_paragraph('下方是一張示例圖片(請確保圖片文件存在):')
# 插入內(nèi)聯(lián)圖片
doc.add_picture('python_logo.png', width=Inches(2), height=Inches(1.2))
# 只設寬度時高度自動等比例縮放
doc.add_picture('chart.png', width=Inches(4))
doc.save('05_image.docx')
print("圖片文檔已生成")
add_picture 常用參數(shù):
width/height:指定尺寸,若只指定一個,另一個按比例計算。- 單位可用
Inches,Cm,Pt等。
7.2 添加超鏈接
python-docx 沒有直接提供獨立的超鏈接函數(shù),但我們可以通過添加具有超鏈接樣式的段落,并附加關系來實現(xiàn)。推薦方法:
from docx.oxml.ns import qn
import docx
def add_hyperlink(paragraph, text, url):
"""為段落添加超鏈接"""
part = paragraph.part
r_id = part.relate_to(url, docx.opc.constants.RELATIONSHIP_TYPE.HYPERLINK, is_external=True)
hyperlink = docx.oxml.shared.OxmlElement('w:hyperlink')
hyperlink.set(qn('r:id'), r_id)
new_run = docx.oxml.shared.OxmlElement('w:r')
rPr = docx.oxml.shared.OxmlElement('w:rPr')
c = docx.oxml.shared.OxmlElement('w:rStyle')
c.set(qn('w:val'), 'Hyperlink')
rPr.append(c)
new_run.append(rPr)
new_run.text = text
hyperlink.append(new_run)
paragraph._p.append(hyperlink)
return hyperlink
doc = Document()
p = doc.add_paragraph('訪問 ')
add_hyperlink(p, 'Python 官網(wǎng)', 'https://www.python.org')
doc.save('06_hyperlink.docx')
print("超鏈接文檔已生成")
執(zhí)行后,段落中的“Python 官網(wǎng)”就會顯示為藍色下劃線超鏈接。
8. 頁面控制:分節(jié)符、頁眉頁腳與頁碼
一個 Word 文檔可以包含多個節(jié)(Section),每個節(jié)可以獨立設置頁面尺寸、方向、頁眉頁腳等。
8.1 分節(jié)與頁面設置
from docx import Document
from docx.shared import Inches, Cm
from docx.enum.section import WD_ORIENT
doc = Document()
# 第一節(jié)(默認存在)
section1 = doc.sections[0]
section1.page_width = Cm(21)
section1.page_height = Cm(29.7)
section1.orientation = WD_ORIENT.PORTRAIT # 縱向
section1.left_margin = Cm(2.5)
section1.right_margin = Cm(2.5)
doc.add_paragraph('第一節(jié)的內(nèi)容。')
# 添加新節(jié),并設置為橫向
doc.add_section()
section2 = doc.sections[1]
section2.orientation = WD_ORIENT.LANDSCAPE
section2.page_width = Cm(29.7)
section2.page_height = Cm(21)
doc.add_paragraph('第二節(jié)為橫向頁面,適合放置寬表格。')
doc.save('07_sections.docx')
print("分節(jié)文檔已生成")
8.2 頁眉和頁腳
doc = Document()
section = doc.sections[0]
# 頁眉
header = section.header
header_para = header.paragraphs[0]
header_para.text = "公司內(nèi)部文件 - 機密"
header_para.alignment = 2 # 居中 (CENTER)
# 頁腳添加頁碼
footer = section.footer
footer_para = footer.paragraphs[0]
# 加入自動頁碼字段(PAGE 域)
footer_para.text = "第 "
run = footer_para.add_run()
fldChar1 = run._r.makeelement(docx.oxml.ns.qn('w:fldChar'), {"w:fldCharType": "begin"})
instrText = run._r.makeelement(docx.oxml.ns.qn('w:instrText'), {})
instrText.text = " PAGE "
fldChar2 = run._r.makeelement(docx.oxml.ns.qn('w:fldChar'), {"w:fldCharType": "end"})
run._r.append(fldChar1)
run._r.append(instrText)
run._r.append(fldChar2)
footer_para.add_run(" 頁")
doc.add_paragraph('正文內(nèi)容...')
doc.save('08_header_footer.docx')
print("頁眉頁腳文檔已生成")
打開文檔后,頁腳會顯示“第 X 頁”。不同節(jié)可以擁有獨立的頁眉頁腳。
9. 樣式與主題:打造專業(yè)文檔模板
除了內(nèi)建樣式(如 Title, Heading 1, Normal 等),我們可以自定義樣式,實現(xiàn)統(tǒng)一排版。
9.1 使用內(nèi)建樣式
doc = Document()
doc.add_paragraph('標題自動應用 Heading 1', style='Heading 1')
doc.add_paragraph('此處為正常正文', style='Normal')
doc.add_paragraph('帶編號的列表項 1', style='List Number')
doc.add_paragraph('帶編號的列表項 2', style='List Number')
doc.save('09_builtin_styles.docx')
9.2 自定義段落樣式
from docx.enum.style import WD_STYLE_TYPE
style = doc.styles.add_style('MyCustomStyle', WD_STYLE_TYPE.PARAGRAPH)
style.font.name = '微軟雅黑'
style.font.size = Pt(11)
style.font.color.rgb = RGBColor(0x33, 0x33, 0x33)
style.paragraph_format.space_after = Pt(8)
style.paragraph_format.line_spacing = 1.2
doc.add_paragraph('使用自定義樣式的段落。', style='MyCustomStyle')
9.3 修改當前文檔的默認樣式
doc = Document()
style = doc.styles['Normal']
style.font.name = 'Times New Roman'
style.font.size = Pt(12)
style.paragraph_format.space_after = Pt(6)
doc.add_paragraph('所有 Normal 都會繼承此設置。')
10. 高級操作:文檔合并、替換與郵件合并
10.1 合并多個 Word 文檔
思路:將一個文檔的所有元素(段落、表格等)逐一復制到另一個文檔末尾。
from docx import Document
def merge_docs(target_doc, source_path):
src = Document(source_path)
for element in src.element.body:
target_doc.element.body.append(element)
doc = Document()
doc.add_heading('合并文檔示例', 0)
doc.add_paragraph('第一部分')
# 模擬兩個獨立文檔
Document('part1.docx').save('part1.docx') # 自己創(chuàng)建,可替換為真實文件
Document('part2.docx').save('part2.docx')
merge_docs(doc, 'part1.docx')
merge_docs(doc, 'part2.docx')
doc.save('10_merged.docx')
print("合并完成:10_merged.docx")
注意:此方法會復制元素但不會自動處理樣式/圖片關系,復雜文檔建議使用 python-docx 模板方式或 COM 對象。
10.2 文本替換
doc = Document('template.docx') # 包含占位符如 {{name}}
for para in doc.paragraphs:
if '{{name}}' in para.text:
para.text = para.text.replace('{{name}}', '張三')
# 注意:這種方式會清除原有 Run 級格式。更優(yōu)雅的方法是遍歷 Run 替換,保留格式:
for para in doc.paragraphs:
for run in para.runs:
if '{{' in run.text:
run.text = run.text.replace('{{name}}', '張三')
doc.save('10_replaced.docx')
10.3 郵件合并(類似 Mail Merge)
典型場景:用同一個模板,根據(jù)數(shù)據(jù)源生成多份信函。
data = [
{'name': '張三', 'amount': 5000},
{'name': '李四', 'amount': 3000}
]
for i, record in enumerate(data):
doc = Document('template_letter.docx')
for para in doc.paragraphs:
for run in para.runs:
if '{{name}}' in run.text:
run.text = run.text.replace('{{name}}', record['name'])
if '{{amount}}' in run.text:
run.text = run.text.replace('{{amount}}', str(record['amount']))
doc.save(f'letter_{i+1}.docx')
print("批量信函已生成")
11. 格式轉(zhuǎn)換:Word 轉(zhuǎn) PDF 等
11.1 使用 docx2pdf (Windows/macOS)
from docx2pdf import convert
convert('report.docx', 'report.pdf')
print("轉(zhuǎn)換完成:report.pdf")
批量轉(zhuǎn)換:
convert('input_folder/', 'output_folder/')
11.2 使用 win32com (僅 Windows, 功能更強大)
import win32com.client
def docx_to_pdf(input_path, output_path):
word = win32com.client.Dispatch("Word.Application")
word.Visible = False
doc = word.Documents.Open(input_path)
doc.SaveAs(output_path, FileFormat=17) # 17 代表 PDF
doc.Close()
word.Quit()
print(f"PDF 已生成: {output_path}")
docx_to_pdf('report.docx', 'report.pdf')
FileFormat 常量參考:
- 16:docx
- 17:PDF
- 其他格式可查 MSDN。
12. 實戰(zhàn)案例:自動化生成月度報表
場景:從 Excel 讀取銷售數(shù)據(jù),生成圖文并茂的 Word 報告,并導出 PDF。
數(shù)據(jù)準備 (sales_data.xlsx)
腳本實現(xiàn)
import pandas as pd
from docx import Document
from docx.shared import Inches, Pt, RGBColor
from docx.enum.text import WD_ALIGN_PARAGRAPH
import matplotlib.pyplot as plt
from docx2pdf import convert
import os
# 1. 讀取數(shù)據(jù)
df = pd.read_excel('sales_data.xlsx')
print("讀取數(shù)據(jù)預覽:\n", df)
# 2. 生成圖表
plt.figure()
plt.plot(df['月份'], df['銷售額(萬)'], marker='o', label='銷售額')
plt.plot(df['月份'], df['利潤(萬)'], marker='s', label='利潤')
plt.xlabel('月份')
plt.ylabel('金額(萬元)')
plt.title('月度銷售趨勢')
plt.legend()
plt.tight_layout()
chart_file = 'sales_chart.png'
plt.savefig(chart_file)
plt.close()
# 3. 創(chuàng)建 Word 報告
doc = Document()
# 標題
title = doc.add_heading('月度銷售報告', level=0)
title.alignment = WD_ALIGN_PARAGRAPH.CENTER
# 摘要
summary = doc.add_paragraph()
summary.add_run('報告摘要:').bold = True
summary.add_run(f'本期共分析 {len(df)} 個月數(shù)據(jù),平均銷售額 {df["銷售額(萬)"].mean():.2f} 萬元。')
# 表格
doc.add_heading('詳細數(shù)據(jù)', level=2)
table = doc.add_table(rows=len(df)+1, cols=3, style='Light Shading Accent 1')
# 表頭
for i, col in enumerate(df.columns):
table.cell(0, i).text = col
for run in table.cell(0, i).paragraphs[0].runs:
run.bold = True
# 數(shù)據(jù)行
for idx, row in df.iterrows():
for j, val in enumerate(row):
table.cell(idx+1, j).text = str(val)
# 插入圖表
doc.add_heading('銷售趨勢圖', level=2)
doc.add_picture(chart_file, width=Inches(5.5))
# 頁腳
footer = doc.sections[0].footer
footer_para = footer.paragraphs[0]
footer_para.text = "自動生成報告 - 僅供內(nèi)部使用"
report_path = 'monthly_report.docx'
doc.save(report_path)
print(f"Word 報告已生成:{report_path}")
# 4. 轉(zhuǎn)換成 PDF
pdf_path = 'monthly_report.pdf'
try:
convert(report_path, pdf_path)
print(f"PDF 報告已生成:{pdf_path}")
except Exception as e:
print(f"PDF 轉(zhuǎn)換失敗(可能未安裝 Word 或依賴缺失): {e}")
執(zhí)行輸出:
讀取數(shù)據(jù)預覽:
月份 銷售額(萬) 利潤(萬)
0 1月 120 30
1 2月 150 40
2 3月 180 50
Word 報告已生成:monthly_report.docx
PDF 報告已生成:monthly_report.pdf
這個案例串聯(lián)了數(shù)據(jù)讀取、圖表生成、文檔排版、頁眉頁腳、格式轉(zhuǎn)換等核心技術。
13. 總結與擴展資源
通過本文,你已經(jīng)從零開始掌握了 Python 操作 Word 的核心技能:
- 文檔創(chuàng)建、段落與格式
- 表格、圖片、超鏈接
- 頁眉頁腳、分節(jié)布局
- 樣式與模板化
- 文檔合并與郵件合并
- Word 轉(zhuǎn) PDF 實際部署
常見問題與注意事項
- 字體缺失:服務器環(huán)境無中文字體時,生成的 docx 在其他電腦打開可能顯示為方塊。解決方案:安裝所需字體,或通過
run.font.name設置通用字體(如宋體)。 - 圖片路徑:務必使用絕對路徑或在運行目錄下。
- 樣式繼承:當 Run 的某個屬性為
None時,表示繼承最近的非 None 值,這可能造成格式混亂,建議顯式設置。 - 大文檔性能:通過
python-docx處理超長表格或大量圖片時,速度會下降。可考慮直接操作 XML 或使用流式生成。
到此這篇關于從入門到精通詳解Python操作Word的實戰(zhàn)指南的文章就介紹到這了,更多相關Python操作Word內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
- Python操作Word文檔屬性與字數(shù)統(tǒng)計的方法詳解
- Python操作Word文檔節(jié)與頁面設置
- Python操作Word頁眉頁腳的完整指南
- Python操作Office(Word/Excel/PowerPoint)文檔的功能庫使用詳解
- Python通過win32com庫操作Word的詳細教程
- 使用Python實現(xiàn)Word文檔處理自動化的操作方法
- Python自動化處理Excel、Word、PDF文檔的操作大全
- Python使用python-docx庫操作word(創(chuàng)建、讀取和插入)文檔的完整指南
- 利用Python實現(xiàn)文檔格式互轉(zhuǎn)的操作大全(PDF、Word、圖片、Markdown)
相關文章
python多版本工具miniconda的配置優(yōu)化實現(xiàn)
通過Miniconda,您可以輕松地創(chuàng)建和管理多個Python環(huán)境,同時確保每個環(huán)境具有所需的依賴項和軟件包,本文主要介紹了python多版本工具miniconda的配置優(yōu)化實現(xiàn),感興趣的可以了解一下2024-01-01
Python實現(xiàn)刪除windows下的長路徑文件
這篇文章主要為大家詳細介紹一下如何利用Python語言實現(xiàn)刪除windows下的長路徑文件功能,文中的示例代碼講解詳細,具有一定參考借鑒價值,感興趣的可以了解一下2022-07-07
pycharm 主題theme設置調(diào)整仿sublime的方法
今天小編就為大家分享一篇pycharm 主題theme設置調(diào)整仿sublime的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-05-05

