ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

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

用 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),仅供参考
返回列表