用 python-docx 和 python-pptx 批量生成 Word 与 PowerPoint:Python-100-Days 办公自动化实战(Day 26)

发布时间:2026/9/30 1:46:31

用 python-docx 和 python-pptx 批量生成 Word 与 PowerPoint:Python-100-Days 办公自动化实战(Day 26) 文档教程【免费下载链接】Python-100-DaysPython - 100天从新手到大师项目地址https://gitcode.com/GitHub_Trending/py/Python-100-Days点击查看免费下载在日常办公中合同、证明、通知、汇报等正式文档的批量制作往往枯燥且重复先按模板手工填写内容再逐个导出 Word 或 PowerPoint。本篇文章源自《Python-100-Days》课程 Day21-30 阶段 的第 26 天围绕python-docx与python-pptx两个三方库系统讲解如何用 Python 程序从零创建 Word 文档、读取已有文档、基于模板批量生成文档以及如何生成 PowerPoint 幻灯片。学完本篇你将掌握一套可复制、可落地的文档批量化生成方案把繁琐的“填模板”工作交给程序完成。为什么用 Python 操作 Word 和 PowerPointWord 是微软公司开发的文字处理程序日常办公中很多正式文档如离职证明、合同、公文都用它撰写和编辑目前主流文件格式为.docx。PowerPoint 是微软 Office 系列中的演示文稿程序被商业人士、教师、学生等群体广泛使用通常也被称为“幻灯片”。这两类文件的本质都是基于 Office Open XMLOOXML的打包格式因此完全可以通过编程方式读写。在 Python 生态中使用名为python-docx的三方库操作 Word读取、修改、创建.docx使用名为python-pptx的三方库生成 PowerPoint.pptx。二者分别将复杂的 OOXML 文档结构抽象为直观的对象模型Document/Paragraph/RunWordPresentation/Slide/Shape/TextFramePowerPoint使得“程序写文档”像写普通代码一样自然。在本课程体系中本篇与 23.Python读写CSV文件.md、24.Python读写Excel文件-1.md、25.Python读写Excel文件-2.md、27.Python操作PDF文件.md 共同构成“Python 语言应用——办公自动化”主线README.md 中的课程目录可以对照查阅。环境准备安装两个三方库首先安装操作 Word 的python-docx库pip install python-docx生成 PowerPoint 需要安装python-pptx库pip install python-pptx安装完成后在交互式命令行中执行from docx import Document、from pptx import Presentation不报错即表示环境就绪。建议在虚拟环境中安装避免污染全局 Python 环境。用 python-docx 从零创建 Word 文档对象模型Document、Paragraph、Run理解python-docx的关键是三层对象模型Document代表整个 Word 文档负责“添加”各类内容并最终保存到文件Paragraph文档中的段落是正文排版的基本单位Run段落内部的一段连续文本拥有独立的字体、字号、加粗、下划线等格式属性。同一段落中不同样式的文字必须拆分成多个Run这正是后续占位符替换时要逐 Run 处理的原因。完整示例生成一份图文表格俱全的文档按照python-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 # 添加大标题level 0 表示文档标题 document.add_heading(快快乐乐学Python, 0) # 添加段落并通过 Run 精细控制局部样式 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, level1) # 添加带样式的段落 document.add_paragraph(Intense quote, styleIntense Quote) # 添加无序列表 document.add_paragraph( first item in unordered list, styleList Bullet ) document.add_paragraph( second item in ordered list, styleList Bullet ) # 添加有序列表 document.add_paragraph( first item in ordered list, styleList Number ) document.add_paragraph( second item in ordered list, styleList Number ) # 添加图片注意路径和图片必须要存在 document.add_picture(resources/guido.jpg, widthCm(5.2)) # 添加分节符 document.add_section() records ( (骆昊, 男, 1995-5-5), (孙美丽, 女, 1992-2-2) ) # 添加表格 table document.add_table(rows1, cols3) 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)对上述关键 API 逐一说明add_heading(text, level)按标题层级添加标题level0为文档大标题level1为一级标题更大的数字对应更深层级。add_paragraph(text, style)添加段落style参数可复用内置样式如Intense Quote强调引用、List Bullet无序列表、List Number有序列表。注意示例中两处“无序列表”文本先后使用了List Bullet与List Number两种样式后者实际呈现为有序列表项。Run的格式控制run.bold True设置加粗run.underline True设置下划线run.font.size Pt(18)设置字号Pt来自docx.shared表示磅值Cm用于厘米单位的尺寸如图片宽度。add_picture(path, width...)插入图片可用widthCm(5.2)控制宽度图片路径必须真实存在。add_section()添加分节符新节可以拥有独立的页面设置纸张、页边距等适合文档中不同部分需要不同版式的场景。add_table(rows, cols)创建表格通过table.style Dark List套用内置样式table.rows[0].cells可逐格写入表头table.add_row().cells动态追加数据行。add_page_break()插入分页符将后续内容推至下一页。document.save(demo.docx)保存为.docx文件。提示代码中# type: Doc的注释是为了在 PyCharm 中获得代码补全提示。如果不显式标注对象的具体数据类型PyCharm 无法在后续代码中给出Doc对象的代码补全提示输入起来容易出错。这是本项目代码中的一个实用小技巧。执行上面的代码并打开生成的 Word 文档可以看到标题、正文、列表、图片、表格与分页符均被正确渲染效果如下所示。资源说明示例中引用的resources/guido.jpg是外部准备的一张图片文件。本仓库的 Day66-80/code/res/guido.jpg 目录下保存有同名的人像图片Python 之父吉多·范罗苏姆运行示例时可将其复制到当前目录并修改路径或自行准备任意图片。读取已有 Word 文档遍历段落内容对于已经存在的 Word 文件可以通过Document(path)打开并遍历其所有段落获取内容。下面的代码读取一份《离职证明》文档并逐段打印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)读取到的内容如下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返回文档中所有段落对象p.text提取其纯文本内容。遍历时通过enumerate拿到段落序号可以快速定位文档结构。需要注意的是示例中的resources/离职证明.docx是课程配套的外部样例文件不在本仓库内读者可以按相同格式自行准备一份测试文档来验证这段读取逻辑。核心实战基于模板批量生成 Word 文档思路占位符替换读取文档的能力带来一个重要启发如果把《离职证明》这类固定格式文档中的姓名、身份证号、入职/离职日期等信息替换为{name}、{id}、{sdate}、{edate}之类的占位符做成一个模板文件那么程序只需要把占位符替换为真实信息就能根据实际需要批量生成无数份个性化文档。这正是办公自动化的典型场景。首先编辑一份离职证明的模板文件正文中使用花括号包裹的占位符标记待替换内容模板效果如下所示。关键难点为什么必须逐 Run 替换直接修改paragraph.text虽然简单但会丢失段落中已有的样式字体、字号、加粗等因为text属性是各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)逐行拆解这段“模板替换”逻辑外层循环遍历employees列表每个人对应生成一份文档读取模板Document(resources/离职证明模板.docx)在循环内每次重新读取保证多份输出互不影响每份都基于原始模板生成段落筛选if { not in p.text: continue跳过不含占位符的段落减少无谓的遍历开销Run 级替换对包含{的段落逐 Run 查找占位符通过find({)与find(})定位占位符边界提取出key如name与place_holder如{name}再用run.text.replace(place_holder, emp_dict[key])完成替换保存以员工姓名命名输出文件如骆昊离职证明.docx。执行上面的代码会在当前路径下生成三个 Word 文档文件名与员工一一对应如下图所示。注意模板文件resources/离职证明模板.docx为课程外部样例不在本仓库内读者可按照上图的占位符格式自行制作模板例如在 Word 中键入兹证明 {name}身份证号码{id}于 {sdate} 至 {edate} 在我单位 {department} 部门担任 {position} 职务……并另存为.docx。延伸批量文档的下游应用批量生成的文档并非终点。在本课程 29.Python发送邮件和短信.md 中程序会将上述流程生成的王大锤离职证明.docx作为邮件附件发送给收件人见该文档“发送带附件的邮件”一节代码通过open(resources/王大锤离职证明.docx, rb)读取附件内容。把“生成文档”与“邮件发送”串联起来就构成了一条完整的自动化链路模板批量生成 → 按人落盘 → 附件邮件分发这正是办公自动化在真实业务中的落地形态。用 python-pptx 生成 PowerPointPowerPoint 的编程化操作与 Word 类似但对象模型不同。核心概念包括Presentation整个演示文稿相当于一个.pptx文件slide_layouts母版提供的版式集合每个索引对应一种布局如封面、标题正文Slide文稿中的一页通过slides.add_slide(layout)创建Shape与placeholder页面上的形状与占位符标题栏、正文栏等用于定位和填充内容TextFrame与Paragraph文本框及其中的段落paragraph.level控制段落缩进层级。官方文档提供的一段示例代码展示了基本用法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]是“标题幻灯片”版式包含标题与副标题两个占位符slide_layouts[1]是“标题和内容”版式。不同版式拥有不同的占位符结构因此访问placeholders[1]前应先确认所用版式。slide.shapes.title返回页面的标题形状直接赋值title.text即可设置标题文字。placeholders[1]是正文占位符其text_frame是一个文本框先通过tf.text设置首段文字再用tf.add_paragraph()追加段落p.level 1 / 2控制段落的缩进层级从而呈现多级项目符号的效果。pres.save(test.pptx)保存演示文稿。运行上面的代码生成的 PowerPoint 文件包含两页第一页是标题页“Welcome to Python / Life is short, I use Python”第二页是带两级段落的大纲页效果如下所示。在python-pptx官方文档中还可以找到更多进阶能力如插入图片、绘制形状、设置动画与母版等本示例已覆盖“建文稿 → 选版式 → 加页 → 填占位符 → 多级文本 → 保存”的完整闭环足以支撑汇报类 PPT 的自动化生成。总结一次编码一劳永逸用 Python 程序解决办公自动化的问题非常高效它可以把我们从繁琐乏味的重复劳动中解放出来先把样板文件做成带占位符的模板再写一段循环替换与保存的代码就能批量产出格式统一、内容个性化的 Word 文档同理用python-pptx也可以按模板批量生成演示文稿。写这类代码是“做一件一劳永逸的事情”——编码过程即便不怎么愉快使用这些代码的时候会非常开心。围绕本主题还可以继续深入的三条路线均可在本仓库课程中找到对应章节表格与样式进阶结合 24.Python读写Excel文件-1.md 与 25.Python读写Excel文件-2.md实现“Excel 数据 → Word 文档”的流水线PDF 侧的输出参考 27.Python操作PDF文件.md将生成结果转存为 PDF 便于分发归档自动化发送参考 29.Python发送邮件和短信.md把批量生成的文档作为附件自动发送给对应人员打通从“生成”到“送达”的最后一步。赞分享文档教程【免费下载链接】Python-100-DaysPython - 100天从新手到大师项目地址https://gitcode.com/GitHub_Trending/py/Python-100-Days点击查看免费下载相关推荐nanoGPTKarpathy 的轻量 GPT 训练仓库三分钟训出一个小模型nanoGPTKarpathy 的轻量 GPT 训练仓库三分钟训出一个小模型 大语言模型对多数开发者来说仍是黑盒——你会用 GPT却很少亲手训练过一个人工智能大模型预训练深度学习微调Python自动化办公使用python-docx库高效处理Word文档的完整指南你是否曾经为批量生成报告而头疼是否在重复的文档格式化工作中浪费了宝贵时间现在让我们用python docx这个强大的工具彻底改变你的办公方式 常序列化后端Python自动化办公终极指南如何用python-docx快速高效处理Word文档还在为重复的Word文档处理工作烦恼吗每天花费大量时间在格式调整、内容复制粘贴上现在让我来告诉你一个革命性的解决方案——使用python docx库彻底序列化后端上一篇3步实现微信QQ消息防撤回PC版防撤回补丁完整解决方案下一篇革命性Flutter可视化库graphic用语法构建优雅数据图表的完整指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
延伸阅读

更多相关文章

2026/9/30 1:46:31

使用git管理代码仓库

一、新建本地仓库并将代码上传到空的远程仓库 新建远程仓库 登录代码托管平台,新建git仓库,假设其地址为 https://www.todo.com/your-username/repo_name.git本地仓库初始化 打开终端,进入本地代码所在的文件夹,运行 git init将本…

2026/9/30 1:46:31

大模型开发框架的演进趋势:从胶水层到标准化基础设施

大模型开发框架的演进趋势:从胶水层到标准化基础设施在大模型(LLM)与生成式 AI 应用爆发的初期,以 LangChain、LlamaIndex 为代表的开源开发框架迅速风靡全球。 在那个百家争鸣的探索阶段,这些框架的核心价值在于充当*…

2026/9/30 3:51:37

Model-Optimizer:大模型推理全链路分层优化实践指南

1. 项目概述:Model-Optimizer不是工具名,而是一类工程实践的统称 “Model-Optimizer”这个词在当前技术社区里常被误认为是一个具体软件或开源项目——比如有人搜“Model-Optimizer下载”“Model-Optimizer GitHub”,结果却找不到官方仓库。…

2026/9/30 3:51:37

SFINAE 机制全解析:从 enable_if 到 void_t 的模板实战

有些话说在前头:模板编程里最让人上头的部分,多半不是怎么把类型算出来,而是怎么让编译器“在你不想要的时候别报错,在你想选的时候刚好选对”。SFINAE 就是这一整套把戏的核心发动机。如果你玩 C 模板玩到一定阶段,一…

2026/9/30 3:51:37

大模型推理加速工程实践:TensorRT与vLLM协同部署指南

1. 项目概述:Model-Optimizer不是工具名,而是工程范式的代号“Model-Optimizer”这个标题乍看像某个开源库或GUI软件的名称,但结合NVIDIA、TensorRT-LLM、vLLM、PT文件转换、Docker镜像部署等高频热词,它实际指向的是一整套面向生…

2026/9/30 3:51:37

TensorFlow 2024实战:安装避坑、Keras 3与模型部署全流程

2024年聊起TensorFlow,注定不是一句"PyTorch已经赢了"能概括的。过去一年我在好几个生产项目里来回切换框架,发现一个特别有意思的错位:社交媒体上讨论最多的永远是PyTorch生态、LoRA微调、扩散模型,可当我拉开服务器上…

2026/9/30 3:51:37

自动化脚本实战指南:从Shell到UI、接口与CI部署

这些搜索词扔给我的一瞬间,我基本就明白了——问“自动化与脚本”的人,十个里有八个不是想听理论,而是正被某个具体的活儿追着跑:要么是测试任务重复到吐,要么是部署流程卡得人想骂人,再要么就是成天在不同…

2026/9/30 3:46:37

模型优化实战:从ONNX到TensorRT的量化、剪枝与部署加速指南

算力需求暴涨、落地 deadline 卡得死死的——“模型是训出来了,但根本跑不动”这种话我这两年听了太多。模型结构和训练效果只是第一步,真正考验工程能力的,是把一个训练好的模型安全、高效、低损耗地塞进生产环境。就在这个环节,…

2026/9/29 11:07:23

东莞市品牌网站建设报价常见报错与解决

东莞品牌网站建设报价单背后:一份保姆级建站教程避坑实录 网站做好了没人访问,这大概是很多老板最头疼的事。花了大几万做的品牌站,上线后流量惨淡,比路边摊还冷清。别急着骂外包公司,很多“东莞品牌网站建设报价”里藏着不少猫腻,比如用模板站冒充定制…

2026/9/29 21:48:03

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解 【免费下载链接】spirula-studio Cross-vendor 3D Gaussian Splatting trainer - video to splat to mesh, Vulkan or CUDA. 项目地址: https://gitcode.com/GitHub_Trending/sp/spirula-studio Sp…

2026/9/29 7:00:49

SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南 模板网站太丑不够用?别急着加滤镜,那是治标不治本。很多老板盯着后台流量掉得眼红,却还在纠结首页Banner的圆角是不是3像素。这就像穿着西装去挖土,姿势不对,努力白费。我整理这份 速查手册…

2026/9/30 0:01:22

MATLAB+Yalmip+CPLEX实战:综合能源系统优化调度全流程解析

做综合能源系统优化调度这活儿,最痛苦的不是建模本身,而是模型写完之后不知道该怎么求解。看论文里轻飘飘一句“采用Yalmip调用CPLEX求解”,自己上手时却往往卡在环境配置、变量声明、约束写法和求解状态判读上,一耗就是两三天。这…

2026/9/30 0:01:22

I3C比I2C快10倍?RK3576实战:速率、DTS配置与混合总线避坑指南

I3C 比 I2C 快 10 倍?这句话在嵌入式群里传了很久,每次都能吵出一堆截图。前段时间我正好在 RK3576 上调板级 I3C 接口,从控制器寄存器一路摸到 Linux DTS 配置,踩了不少坑,也把这笔速度账彻底算明白了。本文就用 RK35…

2026/9/30 0:01:22

字符串转对象:JSON.parse、new Function与URLSearchParams

“字符串转对象”这几个字,我在技术群里见过的问法至少有十几种:有人拿着一串{a:1,b:2}说 JSON.parse 直接报错,有人要从 URL 里抠出参数,还有人只是想把abc变成能挂属性的东西。js 这门语言里,字符串和对象之间的转换…

2026/9/29 3:53:39

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/29 9:46:12

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/29 6:36:14

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑