☰
Python 办公自动化:用 python-docx 操作 Word 与 python-pptx 生成 PowerPoint(Python-100-Days 第 26 天)
2026/10/14 7:27:48 网站建设 项目流程
  • 教程
  • 文档

【免费下载链接】Python-100-Days

Python - 100天从新手到大师

项目地址:https://gitcode.com/capable-ai/Python-100-Days
点击查看免费下载

日常办公中存在大量简单重复的劳动:按照模板批量生成员工离职证明、根据会议纪要自动排版演示文稿、把数据库记录整理成结构化 Word 报表……这些工作完全可以交给 Python 程序来完成,从而把人力从繁琐乏味的文案劳动中解放出来。本篇文章以 Python-100-Days 项目 Day21-30/26.Python操作Word和PowerPoint文件.md 为核心脉络,完整讲解python-docx读写 Word 文档(.docx)与python-pptx生成 PowerPoint(.pptx)的实战方法。读完本文,你将掌握:用代码从零创建带标题、段落、列表、图片、表格和分页符的 Word 文档;遍历已有 Word 文档提取全部段落文本;以及最实用的技能——把 Word 模板中的占位符批量替换成真实数据,实现“一套模板、批量出证”的办公自动化方案。

Word 是微软公司开发的文字处理程序,日常办公中很多正式文档都是用 Word 撰写和编辑的,目前使用的 Word 文件后缀名一般为.docx;PowerPoint 是微软公司开发的演示文稿程序(俗称“幻灯片”),被商业人士、教师、学生等群体广泛使用。在 Python 生态中,操作这两类文件分别有成熟的三方库:python-docx用于读写 Word,python-pptx用于生成 PowerPoint,二者都是基于微软 Open XML(Office Open XML,OOXML)格式封装的高层 API,上手门槛很低。

操作 Word 文档:从安装到生成第一个.docx

安装 python-docx

python-docx是 Python 操作 Word 文档最常用的三方库,可以通过pip直接安装:

pip install python-docx

安装完成后即可在代码中导入使用。关于该库的完整能力,可以查阅其官方文档(python-docx 官方文档);本文接下来演示的代码路径,也与官方文档推荐的用法保持一致。

用代码从零生成一份 Word 文档

python-docx的核心入口是docx.Document类:Document()构造一个空白文档对象,然后通过该对象的方法依次添加标题、段落、图片、表格、分节符和分页符,最后调用save()保存为.docx文件。下面的示例代码覆盖了 Word 文档中最常用的一批元素:

from docx import Document from docx.shared import Cm, Pt from docx.document import Document as Doc # 创建代表Word文档的Doc对象 document = Document() # type: Doc # 添加大标题 document.add_heading('快快乐乐学Python', 0) # 添加段落 p = document.add_paragraph('Python是一门非常流行的编程语言,它') run = p.add_run('简单') run.bold = True run.font.size = Pt(18) p.add_run('而且') run = p.add_run('优雅') run.font.size = Pt(18) run.underline = True p.add_run('。') # 添加一级标题 document.add_heading('Heading, level 1', level=1) # 添加带样式的段落 document.add_paragraph('Intense quote', style='Intense Quote') # 添加无序列表 document.add_paragraph( 'first item in unordered list', style='List Bullet' ) document.add_paragraph( 'second item in ordered list', style='List Bullet' ) # 添加有序列表 document.add_paragraph( 'first item in ordered list', style='List Number' ) document.add_paragraph( 'second item in ordered list', style='List Number' ) # 添加图片(注意路径和图片必须要存在) document.add_picture('resources/guido.jpg', width=Cm(5.2)) # 添加分节符 document.add_section() records = ( ('骆昊', '男', '1995-5-5'), ('孙美丽', '女', '1992-2-2') ) # 添加表格 table = document.add_table(rows=1, cols=3) table.style = 'Dark List' hdr_cells = table.rows[0].cells hdr_cells[0].text = '姓名' hdr_cells[1].text = '性别' hdr_cells[2].text = '出生日期' # 为表格添加行 for name, sex, birthday in records: row_cells = table.add_row().cells row_cells[0].text = name row_cells[1].text = sex row_cells[2].text = birthday # 添加分页符 document.add_page_break() # 保存文档 document.save('demo.docx')

提示:上面代码中的注释# type: Doc是为了在 PyCharm 中获得代码补全提示。如果不明确写出对象的具体数据类型,PyCharm 无法在后续代码中给出Doc对象的代码补全提示,这会降低编码效率;使用类型注解后,编辑器会自动联想出add_heading、add_paragraph、add_table等方法签名。

对上述代码逐一拆解,核心 API 的用法与注意事项如下:

  • add_heading(text, level):添加标题。level为0表示文档大标题(Title),1表示一级标题,数值越大层级越深。
  • add_paragraph(text, style=None):添加段落。style参数可指定 Word 内置样式名,例如'Intense Quote'是“突出引用”样式,'List Bullet'是无序列表样式,'List Number'是有序列表样式。
  • 段落与 Run 的关系:一个段落(Paragraph)由若干 Run(文本块)组成,p.add_run(text)返回一个Run对象,可以对它单独设置bold(加粗)、font.size(字号,单位为Pt)、underline(下划线)等格式。这正是 Word“段落内局部格式混排”的底层模型,也是后面批量替换占位符时必须在 Run 层面操作的原因。
  • add_picture(path, width=Cm(5.2)):插入图片。width使用docx.shared中的Cm、Mm、Inches等尺寸单位对象,图片路径必须真实存在。
  • add_table(rows, cols)与table.style:创建表格后可用table.rows[0].cells拿到首行单元格并直接写入.text,用table.add_row().cells追加数据行;table.style可以指定内置表格样式名(如'Dark List')。
  • add_section()与add_page_break():分别添加分节符与分页符,用于控制文档的版式结构。

执行上面的代码后,打开生成的demo.docx,即可看到包含大标题、混排段落、一级标题、引用样式、列表、图片、表格与分页的完整文档,效果如文首两张截图所示。

读取已有 Word 文档:遍历段落提取文本

对于已经存在的 Word 文件,Document('路径')会打开该文档,随后可以通过doc.paragraphs拿到文档中全部段落的列表,遍历即可获取每个段落的文本:

from docx import Document from docx.document import Document as Doc doc = Document('resources/离职证明.docx') # type: Doc for no, p in enumerate(doc.paragraphs): print(no, p.text)

提示:如果需要在本地复现本节示例,resources/离职证明.docx这类素材文件通常需要从外部资源获取(如网盘分享链接)。

以上述“离职证明”为例,读取到的段落内容大致如下:

0 1 离 职 证 明 2 3 兹证明 王大锤 ,身份证号码: 100200199512120001 ,于 2018 年 8 月 7 日至 2020 年 6 月 28 日在我单位 开发部 部门担任 Java开发工程师 职务,在职期间无不良表现。因 个人 原因,于 2020 年 6 月 28 日起终止解除劳动合同。现已结清财务相关费用,办理完解除劳动关系相关手续,双方不存在任何劳动争议。 4 5 特此证明! 6 7 8 公司名称(盖章):成都风车车科技有限公司 9 2020 年 6 月 28 日

可以看到,遍历doc.paragraphs时每个元素对应一个段落对象(0表示空段落),p.text返回该段落的纯文本内容。这一能力是后续“模板替换”方案的基础:先读取模板,再定位含占位符的段落,最后写入真实数据。

实战:用占位符模板批量生成 Word 文档

核心思路:把离职证明做成模板

遍历已有文档的能力,加上文档中“姓名、身份证号、入职和离职日期等信息”经常变化的现实需求,很容易引出一个通用方案:把离职证明制作成一个模板文件,把姓名、身份证号、入职和离职日期等信息用占位符代替,然后通过对占位符的替换,按实际需要写入对应信息,从而批量生成 Word 文档。

模板文件的形式如下(以姓名、身份证号、部门、职务、公司等字段占位):

关键细节:为什么要在 Run 层面做替换

在编写替换代码之前,必须先理解一个容易踩坑的细节:不能直接修改段落内容(如直接给p.text赋值),否则会丢失样式。Word 的段落文本是以 Run 为单位存储的,段落样式、字体格式都附着在 Run 上。因此,正确的做法是遍历段落中的p.runs,在 Run 的文本中查找{...}占位符并替换为真实内容。这样既保留了每个 Run 原有的字体、字号等格式,又完成了文本替换。

批量生成代码

下面这段代码维护一个包含多名员工信息的字典列表,然后循环读取模板文件、逐段逐 Run 替换占位符,最后按姓名分别保存文档:

from docx import Document from docx.document import Document as Doc # 将真实信息用字典的方式保存在列表中 employees = [ { 'name': '骆昊', 'id': '100200198011280001', 'sdate': '2008年3月1日', 'edate': '2012年2月29日', 'department': '产品研发', 'position': '架构师', 'company': '成都华为技术有限公司' }, { 'name': '王大锤', 'id': '510210199012125566', 'sdate': '2019年1月1日', 'edate': '2021年4月30日', 'department': '产品研发', 'position': 'Python开发工程师', 'company': '成都谷道科技有限公司' }, { 'name': '李元芳', 'id': '2102101995103221599', 'sdate': '2020年5月10日', 'edate': '2021年3月5日', 'department': '产品研发', 'position': 'Java开发工程师', 'company': '同城企业管理集团有限公司' }, ] # 对列表进行循环遍历,批量生成Word文档 for emp_dict in employees: # 读取离职证明模板文件 doc = Document('resources/离职证明模板.docx') # type: Doc # 循环遍历所有段落寻找占位符 for p in doc.paragraphs: if '{' not in p.text: continue # 不能直接修改段落内容,否则会丢失样式 # 所以需要对段落中的元素进行遍历并进行查找替换 for run in p.runs: if '{' not in run.text: continue # 将占位符换成实际内容 start, end = run.text.find('{'), run.text.find('}') key, place_holder = run.text[start + 1:end], run.text[start:end + 1] run.text = run.text.replace(place_holder, emp_dict[key]) # 每个人对应保存一个Word文档 doc.save(f'{emp_dict["name"]}离职证明.docx')

对代码中的占位符解析逻辑稍作说明:

  • run.text.find('{')与run.text.find('}')分别定位占位符的起止下标;
  • run.text[start + 1:end]取出占位符内部的键名(如name、id、sdate),run.text[start:end + 1]取出完整的占位符文本(如{name});
  • run.text.replace(place_holder, emp_dict[key])用字典中对应的真实值替换占位符,实现“按键取值、按位替换”。

执行上面的代码,会在当前路径下生成三个 Word 文档,分别对应名单中的三位员工,效果如下图所示。

这套“模板 + 数据 + 批量替换”的模式,是办公自动化中极具通用性的套路:把数据结构化地维护在列表/字典中(甚至可以从数据库或 Excel 读出),模板只需维护一次,即可批量产出格式统一、样式不丢失的正式文档,可以轻松扩展到合同、证书、通知书、介绍信等各类场景。

生成 PowerPoint:用 python-pptx 制作幻灯片

安装 python-pptx

与python-docx类似,生成 PowerPoint 需要使用python-pptx三方库,安装命令如下:

pip install python-pptx

基于母版版式添加幻灯片

python-pptx的核心思想是:从Presentation()创建演示文稿对象,通过slide_layouts(幻灯片母版中预定义的版式)来添加新页,再在页面上通过placeholders(占位符)写入标题、正文等内容。下面这段代码来自其官方文档,完整演示了“标题页 + 项目符号页”两张幻灯片的创建过程:

from pptx import Presentation # 创建幻灯片对象 pres = Presentation() # 选择母版添加一页 title_slide_layout = pres.slide_layouts[0] slide = pres.slides.add_slide(title_slide_layout) # 获取标题栏和副标题栏 title = slide.shapes.title subtitle = slide.placeholders[1] # 编辑标题和副标题 title.text = "Welcome to Python" subtitle.text = "Life is short, I use Python" # 选择母版添加一页 bullet_slide_layout = pres.slide_layouts[1] slide = pres.slides.add_slide(bullet_slide_layout) # 获取页面上所有形状 shapes = slide.shapes # 获取标题和主体 title_shape = shapes.title body_shape = shapes.placeholders[1] # 编辑标题 title_shape.text = 'Introduction' # 编辑主体内容 tf = body_shape.text_frame tf.text = 'History of Python' # 添加一个一级段落 p = tf.add_paragraph() p.text = 'X\'max 1989' p.level = 1 # 添加一个二级段落 p = tf.add_paragraph() p.text = 'Guido began to write interpreter for Python.' p.level = 2 # 保存幻灯片 pres.save('test.pptx')

这段代码涉及的几个核心概念:

  • pres.slide_layouts[0]/[1]:从默认模板中选择版式,0通常对应“标题幻灯片”(含标题与副标题占位符),1通常对应“标题和内容”版式(正文为带项目符号的文本框)。
  • slide.shapes.title:获取该页的标题占位符,直接赋值.text即可写入标题。
  • slide.placeholders[1]:按索引获取占位符,1一般是正文/副标题占位符,用于写入主体内容。
  • body_shape.text_frame:占位符内部的文本框。tf.text设置首段文本;tf.add_paragraph()追加新段落并可通过p.level设置大纲层级(1为一级项目符号,2为二级项目符号),从而构造多级列表结构。

运行上面的代码,生成的 PowerPoint 文件如下图所示,包含标题页与内容页两张幻灯片。

说明:用 Python 操作 PowerPoint 的实际应用场景相对 Word 少一些,官方文档(python-pptx 官方文档)中还有图表、图片、表格、母版定制等更丰富的用法,有需要时可按官方示例进一步扩展。需要注意的是,python-pptx的核心 API 面向新建/编辑演示文稿,若要从既有 PPT 模板批量填充数据,思路与 Word 模板替换类似:打开已有文件、定位占位符或形状、写入数据后另存。

总结

用 Python 程序解决办公自动化的问题真的非常酷,它可以将我们从繁琐乏味的劳动中解放出来。写这类代码就是去做一件一劳永逸的事情:写代码的过程即便不怎么愉快,使用这些代码的时候应该是非常开心的。本文围绕 Python-100-Days 第 26 天文档,完整覆盖了python-docx的文档创建(标题、段落、Run 混排、列表、图片、表格、分页)、既有文档读取,以及基于占位符的批量模板替换;同时覆盖了python-pptx基于母版版式生成幻灯片的流程。掌握了这套方法,你就能把“重复排版”这类低价值劳动交给程序,把时间留给更有创造性的工作。

如果想继续深入办公自动化主题,本仓库的后续章节还涵盖了 Python操作PDF文件、Python处理图像、Python发送邮件和短信 以及 正则表达式的应用 等内容,可以作为延伸阅读。

  • 教程
  • 文档

【免费下载链接】Python-100-Days

Python - 100天从新手到大师

项目地址:https://gitcode.com/capable-ai/Python-100-Days
点击查看免费下载

相关推荐

上一篇:抖音无水印批量下载工具完整指南:3步跑通douyin-downloader
下一篇:抖音视频批量下载工具怎么选?10 分钟跑通第一个批量任务的实操笔记

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询