Python使用python-docx自动化处理Word的实战指南

 更新时间:2026年06月29日 08:41:59   作者:张老师技术栈  
这篇文章详细介绍了使用Python的python-docx库进行Word文档自动化处理的方法,涵盖安装、基础操作、实战案例等内容,帮助用户批量处理Word文档如生成合同模板和提取简历信息等提高办公效率,需要的朋友可以参考下

日常工作中最烦的就是批量处理 Word——生成几十份合同模板、从几百份简历里提取信息、把表格数据导出成报告……手动做不仅累还容易出错。用 Python 的 python-docx 库,这些都能自动搞定。

一、安装与基础操作

pip install python-docx
from docx import Document

# 打开已有的 Word 文档
doc = Document("报告.docx")

# 创建一个新的空文档
doc2 = Document()
doc2.save("新文档.docx")

二、读取 Word 文档内容

from docx import Document

doc = Document("报告.docx")

# 1. 读取所有段落
print("=== 段落内容 ===")
for i, para in enumerate(doc.paragraphs):
    if para.text.strip():  # 只打印非空段落
        print(f"段落{i}: {para.text.strip()}")

# 2. 读取表格
print("\n=== 表格内容 ===")
for t_idx, table in enumerate(doc.tables):
    print(f"\n--- 表格 {t_idx + 1} ---")
    for r_idx, row in enumerate(table.rows):
        cells = [cell.text for cell in row.cells]
        print(f"第{r_idx + 1}行: {cells}")

# 3. 读取标题
print("\n=== 标题 ===")
for para in doc.paragraphs:
    if para.style.name.startswith("Heading"):
        print(f"[{para.style.name}] {para.text}")

实际场景: 批量读取多份简历的特定字段(姓名、电话、学历等)。

三、写入 Word 文档

1. 添加段落

from docx import Document
from docx.shared import Pt, RGBColor
from docx.enum.text import WD_ALIGN_PARAGRAPH

doc = Document()

# 添加标题
doc.add_heading("工作报告", level=0)  # 文档标题
doc.add_heading("一、项目概况", level=1)
doc.add_heading("1.1 项目背景", level=2)

# 添加普通段落
para = doc.add_paragraph("这是正文内容。")
para.alignment = WD_ALIGN_PARAGRAPH.LEFT  # 左对齐

# 带格式的段落
para2 = doc.add_paragraph()
run = para2.add_run("红色加粗文字")
run.bold = True
run.font.size = Pt(14)
run.font.color.rgb = RGBColor(255, 0, 0)

run2 = para2.add_run(" 普通后续文字")
run2.font.size = Pt(12)

doc.save("输出文档.docx")

2. 添加表格

from docx import Document
from docx.shared import Pt, Cm

doc = Document()

# 添加标题
doc.add_heading("学生成绩表", level=1)

# 创建表格(3行4列)
table = doc.add_table(rows=3, cols=4, style="Table Grid")

# 设置表头
headers = ["姓名", "语文", "数学", "英语"]
for i, h in enumerate(headers):
    cell = table.rows[0].cells[i]
    cell.text = h
    # 加粗表头
    for para in cell.paragraphs:
        for run in para.runs:
            run.bold = True

# 填充数据
data = [
    ["张三", "85", "92", "78"],
    ["李四", "90", "88", "95"],
]

for r_idx, row_data in enumerate(data):
    for c_idx, value in enumerate(row_data):
        table.rows[r_idx + 1].cells[c_idx].text = value

# 设置列宽
for row in table.rows:
    row.cells[0].width = Cm(3)
    row.cells[1].width = Cm(3)
    row.cells[2].width = Cm(3)
    row.cells[3].width = Cm(3)

doc.save("成绩表.docx")

3. 设置页边距

from docx.shared import Cm

doc = Document()

# 设置页边距
for section in doc.sections:
    section.top_margin = Cm(2.54)
    section.bottom_margin = Cm(2.54)
    section.left_margin = Cm(3.17)
    section.right_margin = Cm(3.17)

四、实战案例:批量生成合同

这是办公自动化最经典的场景——模板 + 数据 → 批量生成文档。

准备数据 (employees.csv)

name,department,position,salary,start_date
张三,技术部,Java开发工程师,15000,2024-01-01
李四,产品部,产品经理,13000,2024-02-15
王五,市场部,市场专员,10000,2024-03-01

生成合同

import pandas as pd
from docx import Document
from datetime import datetime
import os

def generate_contract(employee):
    """根据员工数据生成劳动合同"""
    # 读取模板
    doc = Document("合同模板.docx")

    # 替换占位符(模板中用 {{name}} 标记)
    replacements = {
        "{{name}}": employee["name"],
        "{{department}}": employee["department"],
        "{{position}}": employee["position"],
        "{{salary}}": str(employee["salary"]),
        "{{start_date}}": employee["start_date"],
        "{{today}}": datetime.now().strftime("%Y年%m月%d日"),
    }

    for para in doc.paragraphs:
        for key, value in replacements.items():
            if key in para.text:
                # 保留原有格式替换文字
                for run in para.runs:
                    if key in run.text:
                        run.text = run.text.replace(key, value)

    # 保存合同
    output_dir = "合同输出"
    os.makedirs(output_dir, exist_ok=True)
    filename = f"{output_dir}/{employee['name']}_劳动合同.docx"
    doc.save(filename)
    print(f"已生成: {filename}")

# 批量生成
df = pd.read_csv("employees.csv")
for _, emp in df.iterrows():
    generate_contract(emp)

模板制作: 在 Word 里写好合同正文,需要填充的地方用 {{name}} 这样的占位符标记,Python 脚本一键替换。

五、实战案例:从多份简历提取信息

from docx import Document
import re
import os

def extract_resume_info(docx_path):
    """从简历 Word 文档提取关键信息"""
    doc = Document(docx_path)
    full_text = "\n".join([p.text for p in doc.paragraphs])

    info = {}

    # 提取姓名(通常在第一行)
    lines = [p.text.strip() for p in doc.paragraphs if p.text.strip()]
    if lines:
        info["姓名"] = lines[0]

    # 提取手机号(11位数字)
    phone = re.search(r"1[3-9]\d{9}", full_text)
    info["手机号"] = phone.group() if phone else ""

    # 提取邮箱
    email = re.search(r"[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}", full_text)
    info["邮箱"] = email.group() if email else ""

    # 提取毕业院校(包含"大学"或"学院"的字段)
    schools = re.findall(r"[一-龥]+(?:大学|学院)", full_text)
    info["毕业院校"] = schools[0] if schools else ""

    return info

# 批量处理所有简历
resume_dir = "简历文件夹"
results = []

for filename in os.listdir(resume_dir):
    if filename.endswith(".docx"):
        filepath = os.path.join(resume_dir, filename)
        try:
            info = extract_resume_info(filepath)
            info["文件名"] = filename
            results.append(info)
            print(f"已处理: {filename}")
        except Exception as e:
            print(f"处理失败 {filename}: {e}")

# 导出结果到 Excel
import pandas as pd
df = pd.DataFrame(results)
df.to_excel("简历汇总.xlsx", index=False)
print(f"共处理 {len(results)} 份简历,结果已导出到 简历汇总.xlsx")

六、docx 常用格式设置

from docx.shared import Pt, Cm, Inches, RGBColor
from docx.enum.text import WD_ALIGN_PARAGRAPH
from docx.enum.table import WD_TABLE_ALIGNMENT

# 字体设置
run.font.name = "微软雅黑"
run.font.size = Pt(12)
run.bold = True
run.italic = True
run.font.color.rgb = RGBColor(0, 0, 0)  # 黑色

# 段落设置
para.alignment = WD_ALIGN_PARAGRAPH.CENTER  # 居中
para.paragraph_format.space_before = Pt(12)  # 段前间距
para.paragraph_format.space_after = Pt(12)   # 段后间距
para.paragraph_format.line_spacing = 1.5     # 行距 1.5 倍
para.paragraph_format.first_line_indent = Cm(0.74)  # 首行缩进两个字符

# 表格设置
table.alignment = WD_TABLE_ALIGNMENT.CENTER  # 表格居中
cell.vertical_alignment = 1  # 垂直居中

七、常见问题

1. python-docx 不支持 .doc 格式

# .doc 是老版 Word 格式,python-docx 不支持
# 方案一:先转成 .docx(Word 里手动另存为)
# 方案二:用 win32com(仅 Windows)
import win32com.client

word = win32com.client.Dispatch("Word.Application")
doc = word.Documents.Open("旧文档.doc")
doc.SaveAs("新文档.docx", FileFormat=16)  # 16 = wdFormatDocumentDefault
doc.Close()
word.Quit()

2. 图片操作

from docx.shared import Inches

# 插入图片
doc.add_picture("图表.png", width=Inches(5))

# 提取文档中的图片(比较麻烦,需要解压 docx)
from docx.opc.constants import RELATIONSHIP_TYPE as RT
import zipfile
import os

with zipfile.ZipFile("文档.docx", "r") as z:
    for name in z.namelist():
        if name.startswith("word/media/"):
            z.extract(name, "提取的图片/")

八、和其他库搭配

用途搭配场景
pandas数据处理从 Excel 读取数据 → 生成 Word 报告
matplotlib生成图表画好图 → 插入 Word 文档
python-pptx处理 PPT数据和图表转成 PPT 汇报
PDFPlumber处理 PDF从 PDF 提取内容转 Word

典型流程:

import pandas as pd
from docx import Document
import matplotlib.pyplot as plt

# 1. pandas 读取数据
df = pd.read_excel("销售数据.xlsx")
summary = df.groupby("月份")["金额"].sum()

# 2. matplotlib 生成图表
plt.figure(figsize=(8, 4))
summary.plot(kind="bar")
plt.title("月度销售汇总")
plt.savefig("chart.png")

# 3. docx 生成报告
doc = Document()
doc.add_heading("月度销售报告", level=0)
doc.add_paragraph(f"本月总销售额: {summary.sum():.2f} 元")
doc.add_picture("chart.png", width=Inches(5))
doc.save("销售报告.docx")

print("报告已生成")

总结

python-docx 的核心能力就三个:读内容、写内容、改格式。日常办公里 80% 的 Word 自动化需求用这些基础操作就能搞定。

批量生成 → 模板 + 数据替换
批量提取 → 遍历文件夹 + 正则提取
批量转换 → 读数据 → 转格式 → 输出

最关键的是先把模板做好,Word 模板的排版直接影响生成文档的质量。

以上就是Python使用python-docx自动化处理Word文档的实战指南的详细内容,更多关于Python python-docx自动化处理Word的资料请关注脚本之家其它相关文章!

相关文章

  • flask-SQLALchemy连接数据库的实现示例

    flask-SQLALchemy连接数据库的实现示例

    sqlalchemy是数据库的orm框架,让我们操作数据库的时候不要再用sql语句了,本文就介绍了flask-SQLALchemy连接数据库的实现示例,感兴趣的可以了解一下
    2022-06-06
  • Django使用Profile扩展User模块方式

    Django使用Profile扩展User模块方式

    这篇文章主要介绍了Django使用Profile扩展User模块方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-05-05
  • Tensorflow实现神经网络拟合线性回归

    Tensorflow实现神经网络拟合线性回归

    这篇文章主要为大家详细介绍了Tensorflow实现神经网络拟合线性回归,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-07-07
  • Python Web框架Flask中使用七牛云存储实例

    Python Web框架Flask中使用七牛云存储实例

    这篇文章主要介绍了Python Web框架Flask中使用七牛云存储实例,本文也对七牛云存储Python SDK的一个使用示例,需要的朋友可以参考下
    2015-02-02
  • python实现余弦相似度文本比较的示例

    python实现余弦相似度文本比较的示例

    这篇文章主要介绍了python实现余弦相似度文本比较的示例,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-05-05
  • 详解Python执行py文件是否需要可执行权限

    详解Python执行py文件是否需要可执行权限

    这篇文章主要通过几个案例为大家详细介绍一下在Python中执行py文件是否需要可执行权限,文中的示例代码讲解详细,对我们学习Python有一定帮助,需要的可以了解一下
    2023-03-03
  • Python3中PyQt5简单实现文件打开及保存

    Python3中PyQt5简单实现文件打开及保存

    本文将结合实例代码,介绍Python3中PyQt5简单实现文件打开及保存,具有一定的参考价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-06-06
  • python批量下载网站马拉松照片的完整步骤

    python批量下载网站马拉松照片的完整步骤

    这篇文章主要给大家介绍了关于利用python批量下载网站马拉松照片的完整步骤,文中通过示例代码介绍的非常详细,对大家的学习或工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-12-12
  • Python高阶函数map() 简介和使用详解

    Python高阶函数map() 简介和使用详解

    map() 函数是Python中的内置函数,这个函数又叫做映射函数,其实里面具有一个迭代器的功能,会依次遍历可迭代对象进行相关的操作,这篇文章主要介绍了Python高阶函数map() 简介和使用详解,需要的朋友可以参考下
    2023-03-03
  • 详解DBSCAN算法原理及其Python实现

    详解DBSCAN算法原理及其Python实现

    DBSCAN,即Density-Based Spatial Clustering of Applications with Noise,基于密度的噪声应用空间聚类,本文将详细介绍DBSCAN算法的原理及其Python实现,需要的可以参考下
    2023-12-12

最新评论