Python 办公自动化:Word 与 PowerPoint 处理

在日常的 HR、行政甚至运营等场景里,总少不了重复劳动密集型的文档/PPT产出

  • HR 同学可能要给 100 个新员工发入职 Offer
  • 行政要制作带公司 logo、编号、姓名的季度表彰卡
  • 运营要生成 N 份格式统一但核心数据不同的周报附件

这些活儿不难,但机械校对、替换、排版费时费力还容易出错。其实完全可以用 Python 的“模板 + 数据映射”模式一键搞定,今天就聊聊怎么用两个库快速上手。


核心工具库

在 Python 生态,这两个领域几乎是「标准解决方案」:

  • Word 处理python-docx(微软 .docx 专属,旧版 .doc 需要转成新格式)
  • PPT 处理python-pptx(仅支持 .pptx,同理旧版先转换)

先安装起来:

# 建议用国内镜像源更快,比如清华源
pip install python-docx python-pptx -i https://pypi.tuna.tsinghua.edu.cn/simple

一、Word 自动化:从基础到批量生产

1.1 简单上手:从零写一页演示文档

python-docx 的设计逻辑非常直观,把 .docx 拆解成 Document → Paragraph → Run 三层结构,每一层各司其职:

层级作用
Document整个文档的容器(保存 / 保存 / 还是保存)
Paragraph普通段落、标题的容器
Run同一段落内的「独立格式块」(加粗 / 字号 / 字体颜色可以各自不同)

通俗理解:Document 是一本书;Paragraph 是书里的一个自然段;Run 是段落里的一句话,可以拥有不同的格式。比如“这是粗体文字”就是一个段落里包含两个 Run。

先写一段生成基础演示页的代码:

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

# 1. 初始化空文档
doc = Document()

# 2. 添加标题、段落
doc.add_heading('Python 办公自动化入门实战', 0)  # 0 级 = 文档主标题

p = doc.add_paragraph('Python 不止能写爬虫、做 AI,还是 ')
# 添加一个「加粗+14号字」的独立块
highlight_run = p.add_run('职场摸鱼效率翻倍')
highlight_run.bold = True
highlight_run.font.size = Pt(14)
# 如果需要改颜色,可以 highlight_run.font.color.rgb = RGBColor(0xFF, 0x00, 0x00)
p.add_run(' 的神器!')

# 3. 插入图片(指定宽度,高度按比例自动缩放)
try:
    doc.add_picture('company_logo.png', width=Cm(5))
except FileNotFoundError:
    print("⚠️  找不到 company_logo.png,跳过图片插入")

# 4. 插入带边框的表格
table = doc.add_table(rows=1, cols=3)
table.style = 'Table Grid'  # 带网格线的表格样式
# 填充表头
header_cells = table.rows[0].cells
header_cells[0].text = '编号'
header_cells[1].text = '员工姓名'
header_cells[2].text = '入职部门'

# 5. 保存文件
doc.save('python_docx_demo.docx')
print("✅  基础 Word 文档生成成功!")

运行结果:你会得到一张包含标题、带格式段落、图片和表格的 Word 文档,整个过程不需要手动排版。


1.2 进阶核心:模板批量生成(重点!)

从零写文档只能做通用演示,真正能解放双手的是「基于 Word 模板的替换」。这一模式尤其适合制作入职 Offer、离职证明、表彰卡等标准件。

制作模板的小技巧

先在 Word 里手动做好样式完美的模板,比如入职 Offer、离职证明,然后用 双大括号 标记占位符:{employee_name}{entry_date}{position}

⚠️ 踩坑提醒:不要在 Word 里一次性选中占位符的一部分改颜色加粗!!!否则生成的 Run 会被拆碎,替换时可能出现部分占位符替换不上。正确做法是:写占位符时先写成纯文本,等替换逻辑调通后,再在模板里给整个占位符统一改样式。

完整的批量替换脚本

from docx import Document

def fill_word_template(template_path, data_list, output_prefix):
    """
    批量填充 Word 模板并保存
    :param template_path: 模板文件路径
    :param data_list: 待填充的数据列表(每个元素是字典)
    :param output_prefix: 输出文件的前缀
    """
    for index, item in enumerate(data_list):
        doc = Document(template_path)

        # 1. 替换段落中的占位符
        for p in doc.paragraphs:
            for run in p.runs:
                full_text = run.text
                for key, value in item.items():
                    placeholder = f'{{{key}}}'
                    if placeholder in full_text:
                        run.text = run.text.replace(placeholder, str(value))

        # 2. 替换表格中的占位符
        for table in doc.tables:
            for row in table.rows:
                for cell in row.cells:
                    for p in cell.paragraphs:
                        for run in p.runs:
                            full_text = run.text
                            for key, value in item.items():
                                placeholder = f'{{{key}}}'
                                if placeholder in full_text:
                                    run.text = run.text.replace(placeholder, str(value))

        # 3. 生成文件名(用姓名+序号,或者纯序号)
        output_file = f'{output_prefix}_{item["employee_name"]}_{index+1}.docx'
        doc.save(output_file)
        print(f"✅  已生成 {output_file}")


# ------------------ 测试数据 ------------------
employee_data = [
    {
        "employee_name": "骆昊",
        "entry_date": "2026-04-01",
        "position": "高级架构师",
        "department": "技术中台",
        "salary": "35K"
    },
    {
        "employee_name": "王大锤",
        "entry_date": "2026-04-02",
        "position": "全栈开发工程师",
        "department": "电商业务线",
        "salary": "18K"
    }
]

# ------------------ 调用函数 ------------------
if __name__ == "__main__":
    fill_word_template(
        template_path="entry_offer_template.docx",
        data_list=employee_data,
        output_prefix="2026Q2_入职Offer"
    )

核心思路:遍历文档中所有段落和表格中的每一个 Run,检查其中是否包含 {key} 形式的占位符,找到后用字典里的真实数据替换。掌握这一点,你就能瞬间批量生成任意数量的定制化文档。


二、PPT 自动化:用模板生成 + 内容页

PPT 的核心逻辑是母版布局 → 占位符 → 填充。先制作或使用预设的布局,比从零写布局更稳定、更美观。

2.1 基础:用预设布局写演示 PPT

python-pptx 默认提供了一套布局(索引 0~9),例如:

  • 0:标题幻灯片
  • 1:标题和内容
  • 5:空白页(常用于自由发挥)

下面用这些布局快速生成三页 PPT:

from pptx import Presentation
from pptx.util import Inches, Pt
from pptx.dml.color import RGBColor

# 1. 初始化演示文稿(默认宽屏 16:9)
prs = Presentation()

# 2. 第一页:标题页(布局索引 0)
title_layout = prs.slide_layouts[0]
slide1 = prs.slides.add_slide(title_layout)

title_shape = slide1.shapes.title
subtitle_shape = slide1.placeholders[1]   # 占位符索引 1 = 副标题
title_shape.text = "2026Q1 部门效率提升报告"
subtitle_shape.text = "汇报人:技术中台\n汇报时间:2026-03-25"

# 3. 第二页:标题 + 内容(布局索引 1)
content_layout = prs.slide_layouts[1]
slide2 = prs.slides.add_slide(content_layout)

slide2.shapes.title.text = "核心工作成果"

content_frame = slide2.placeholders[1].text_frame
content_frame.text = "1. 入职Offer/离职证明自动化上线"

p2 = content_frame.add_paragraph()
p2.text = "   - 效率提升约 300%"
p2.level = 1   # level 1 表示缩进一级

p3 = content_frame.add_paragraph()
p3.text = "   - 人工错误率降为0%"
p3.level = 1

# 4. 第三页:空白页 + 手动添加标题与图片(布局索引 5)
blank_layout = prs.slide_layouts[5]
slide3 = prs.slides.add_slide(blank_layout)

# 手动添加一个文本框作为标题
left = Inches(1)
top = Inches(0.5)
width = Inches(8)
height = Inches(1)
title_box = slide3.shapes.add_textbox(left, top, width, height)
title_box.text_frame.text = "自动化工具使用流程图"
title_box.text_frame.paragraphs[0].font.size = Pt(24)
title_box.text_frame.paragraphs[0].font.bold = True

# 插入图片
try:
    left_img = Inches(1)
    top_img = Inches(2)
    height_img = Inches(4)
    slide3.shapes.add_picture('automation_flowchart.png',
                              left_img, top_img, height=height_img)
except FileNotFoundError:
    print("⚠️  找不到流程图,跳过插入")

# 5. 保存
prs.save('2026Q1_效率提升报告.pptx')
print("✅  基础 PPT 生成成功!")

说明:第三页使用了空白布局,并通过 add_textbox 自行放置标题,这样布局更灵活。实际项目中,你也可以提前设计好带占位符的 PPT 母版,用类似 Word 模板替换的方式去填充,效果更佳。


三、总结与展望

1. 核心要点

  • Word
    • 牢记三层结构:Document → Paragraph → Run
    • 重点用模板批量生成才是真·摸鱼神器
    • 占位符要统一写纯文本,调通再改样式
  • PPT
    • 优先使用预设布局(索引 0~9),利用占位符填充
    • 对于自由排版需求,用 add_textboxadd_picture 等函数手动摆放

2. 适用场景

这类脚本属于「一劳永逸小工程」,虽然前期可能需要花 1~2 小时调试占位符和排版,但以后每执行一次就能顶 10~100 份文档/PPT,不仅效率飞升,还彻底告别格式错乱和错别字。

如果需要更复杂的功能(比如 Word 插入 Excel 图表、PPT 插入带数据的柱状图/折线图、与邮件自动发送联动),可以继续啃这两个库的官方文档,自动化的大门就此打开。