当前位置: 首页 > news >正文

Day28笔记-Python自动化操作Word

一、操作Word

1.简介

​ 在日常工作中,有很多简单重复的劳动其实完全可以交给Python程序,比如根据样板文件(模板文件)批量的生成很多个Word文件或PowerPoint文件。Word是微软公司开发的文字处理程序,相信大家都不陌生,日常办公中很多正式的文档都是用Word进行撰写和编辑的,目前使用的Word文件后缀名一般为.docx。PowerPoint是微软公司开发的演示文稿程序,是微软的Office系列软件中的一员,被商业人士、教师、学生等群体广泛使用,通常也将其称之为“幻灯片”。在Python中,可以使用名为python-docx 的三方库来操作Word

我们可以先通过下面的命令来安装python-docx三方库。

# 一般情况下
pip install python-docx
# 注意:我们在安装此模块使用的是pip install python-docx,但是在导入的时候是 docx
# 说明:只需要执行pip install python-docx,会自动安装lxml
​
# 可能出现问题:
高版本lxml没有etree模块。有网友确定lxml4.2.5版本带有etree模块,且该版本lxml支持python3.7.4版本。安装命令:
pip install lxml==4.2.5  (若python-docx 使用有问题,需要查看lxml版本)
2.向Word写入内容
# 注意1:我们在安装此模块使用的是pip install python-docx,但是在导入的时候是 docx
# 注意2:一般情况下,如果安装了A库,同时自动安装了依赖B库,如果A库更新了,如果使用过程中报错,则可以更新依赖库
​
# C:\Users\19621>pip install python-docx
# Collecting python-docx
#   Downloading python_docx-1.1.0-py3-none-any.whl (239 kB)
#      |████████████████████████████████| 239 kB 930 kB/s
# Requirement already satisfied: lxml>=3.1.0 in d:\software\anaconda\lib\site-packages (from python-docx) (4.6.3)
# Requirement already satisfied: typing-extensions in d:\software\anaconda\lib\site-packages (from python-docx) (4.9.0)
# Installing collected packages: python-docx
# Successfully installed python-docx-1.1.0
​
# 比如:安装python-docx的过程中,自动安装了依赖库lxml和typing-extensions
​
from docx import  Document
from docx.shared import Cm
​
# 1.创建doc文档对象
doc = Document()
# 2.添加标题
doc.add_heading('今天星期二~~~~')
# 3.添加段落
p = doc.add_paragraph('第一个段落~~~~')
# 注意:一个段落可以由很多个run组成
run1 = p.add_run('this is a test')
run2 = p.add_run('Python是一门面向对象的语言')
run3 = p.add_run('Python是跨平台的')
​
# 给每个run可以单独设置样式
run1.bold = True
run2.underline = True
​
# 4.添加图片
doc.add_picture(r'data/3.png',width=Cm(10))
​
# 5.添加列表
# a.有序列表
doc.add_paragraph('教学部',style='List Number')
doc.add_paragraph('运营部',style='List Number')
doc.add_paragraph('财务部',style='List Number')
doc.add_paragraph('行政部',style='List Number')
doc.add_paragraph('市场部',style='List Number')
​
# b.无序列表
doc.add_paragraph('教学部',style='List Bullet')
doc.add_paragraph('运营部',style='List Bullet')
doc.add_paragraph('财务部',style='List Bullet')
doc.add_paragraph('行政部',style='List Bullet')
doc.add_paragraph('市场部',style='List Bullet')
​
# 保存文件
doc.save(r'data/Python操作word.docx')
3.读取Word内容
from docx import  Document
​
# 1.打开doc
doc = Document(r'data/占勇辉的离职证明.docx')
​
# 2.获取doc中的所有内容,返回一个列表,其中的元素是段落对象
print(doc.paragraphs)
​
# 3.遍历列表,获取每个段落对象
for para in doc.paragraphs:# 获取每个段落的文本# print(para.text)# 获取组成每个段落的run,返回一个列表print(para.runs)for run in para.runs:# 获取每个run的文本print(run.text)
​
4.批量生成Word文件【掌握】

试想,我们如果把上面的离职证明制作成一个模板文件,把姓名、身份证号、入职和离职日期等信息用占位符代替,这样通过对占位符的替换,就可以根据实际需要写入对应的信息,这样就可以批量的生成Word文档。

实现思路:

  1. 首先编辑一个离职证明的模板文件,如下图所示。

  2. 接下来我们读取该文件,将占位符替换为真实信息,就可以生成一个新的Word文档,如下所示。

  1. # 将真实的员工信息保存在字典中
    person_list = [{"name":"杨天偿","id":"333222199909120987","sdate":"2017年7月1日","edate":"2021年11月1日","department":"技术部","position":"架构师","company":"深圳华为技术有限公司"},{"name":"刘一奇","id":"110120198909120937","sdate":"2016年3月1日","edate":"2020年10月1日","department":"行政部","position":"保镖","company":"黑龙江"},{"name":"张国涛","id":"111222199908120987","sdate":"2015年4月1日","edate":"2019年11月1日","department":"后厨部","position":"试吃员","company":"深圳市金威源餐饮有限公司"},{"name":"欧阳","id":"112221199909120987","sdate":"2016年7月1日","edate":"2020年11月1日","department":"后勤部","position":"主管","company":"深圳市abc有限公司"},
    ]
# 需求:根据已知的员工信息,批量生成每个员工的离职证明文件,每个人的文件以该员工的姓名命名
from docx import  Document
# 将真实的员工信息保存在字典中
person_list = [{"name":"杨天偿","id":"333222199909120987","sdate":"2017年7月1日","edate":"2021年11月1日","department":"技术部","position":"架构师","company":"深圳华为技术有限公司"},{"name":"刘一奇","id":"110120198909120937","sdate":"2016年3月1日","edate":"2020年10月1日","department":"行政部","position":"保镖","company":"黑龙江"},{"name":"张国涛","id":"111222199908120987","sdate":"2015年4月1日","edate":"2019年11月1日","department":"后厨部","position":"试吃员","company":"深圳市金威源餐饮有限公司"},{"name":"欧阳","id":"112221199909120987","sdate":"2016年7月1日","edate":"2020年11月1日","department":"后勤部","position":"主管","company":"深圳市abc有限公司"},{"name":"张三","id":"112221199909120987","sdate":"2016年7月1日","edate":"2020年11月1日","department":"后勤部","position":"主管","company":"深圳市abc有限公司"},{"name":"李四","id":"112221199909120987","sdate":"2016年7月1日","edate":"2020年11月1日","department":"后勤部","position":"主管","company":"深圳市abc有限公司"}
]
​
# 实现思路:读取离职证明的模板文件 ,将其中的占位符替换为已知数据中的值
# 遍历列表,批量读取离职证明的模板文件,批量生成离职证明文件
for person in person_list:# 1.读取离职证明的模板文件doc = Document(r'data/离职证明模板.docx')
​# 2.遍历段落,进行数据的处理【将包含占位符的run筛选出来】for p in doc.paragraphs:if '{' not in p.text:continue# 3.遍历每个段落中的runsfor run in p.runs:if '{' not in run.text:continue# 4.完成替换操作:将离职证明模板中的{xxx}的内容替换为字段中指定key对应的值# '{name}'------>'name'---->对应的就是字典中的key# '{department}'------>'{department}'----->对应的就是字典中的key# print(run.text)# 字符串切片# print(run.text[1:-1],type(run.text[1:-1]))key = run.text[1:-1]print(person[key])# 替换:xxx.repalce():因为字符串是不可变的,所以替换之后会生成一个新的字符串,将新的字符串重新赋值给run.text# {name} ---->张三run.text = run.text.replace(run.text,person[key])
​# 将处理之后的数据进行保存,生成新的doc文件doc.save(rf'data/{person["name"]}的离职证明.docx')print(f'{person["name"]}的离职证明文件已生成~~~~~')  

相关文章:

  • 优选驾考系统小程序的设计
  • 工作日志:ruoyi-vue-plus echarts根据窗口大小变化
  • 自己做个国庆75周年头像生成器
  • 基于微信小程序的美食推荐系统
  • 数据结构-栈(理解版)
  • 数据结构之链表(2),双向链表
  • C语言——动态内存分配
  • linux部署redis,整合ansible和redis
  • 前端工程规范-2:JS代码规范(Prettier + ESLint)
  • Python 时间占位符:毫秒的使用
  • VR视频怎样进行加密和一机一码的使用?--加密(一)
  • Zookeeper下载、安装配置
  • 软件设计师——计算机网络
  • 【css】常见布局概述
  • OJ题之单链表排序
  • __proto__ 和 prototype的关系
  • electron原来这么简单----打包你的react、VUE桌面应用程序
  • JavaScript函数式编程(一)
  • Javascript基础之Array数组API
  • Java深入 - 深入理解Java集合
  • MQ框架的比较
  • Mysql数据库的条件查询语句
  • nodejs实现webservice问题总结
  • Redis提升并发能力 | 从0开始构建SpringCloud微服务(2)
  • Spring Cloud中负载均衡器概览
  • Storybook 5.0正式发布:有史以来变化最大的版本\n
  • vue2.0项目引入element-ui
  • windows下使用nginx调试简介
  • 阿里研究院入选中国企业智库系统影响力榜
  • 初识 webpack
  • 短视频宝贝=慢?阿里巴巴工程师这样秒开短视频
  • 工作手记之html2canvas使用概述
  • 猴子数据域名防封接口降低小说被封的风险
  • 互联网大裁员:Java程序员失工作,焉知不能进ali?
  • 今年的LC3大会没了?
  • 探索 JS 中的模块化
  • 中国人寿如何基于容器搭建金融PaaS云平台
  • 完善智慧办公建设,小熊U租获京东数千万元A+轮融资 ...
  • ​​​​​​​STM32通过SPI硬件读写W25Q64
  • ​软考-高级-系统架构设计师教程(清华第2版)【第20章 系统架构设计师论文写作要点(P717~728)-思维导图】​
  • !$boo在php中什么意思,php前戏
  • # Redis 入门到精通(一)数据类型(4)
  • #define MODIFY_REG(REG, CLEARMASK, SETMASK)
  • #Linux(Source Insight安装及工程建立)
  • (STM32笔记)九、RCC时钟树与时钟 第二部分
  • (第61天)多租户架构(CDB/PDB)
  • (附源码)python旅游推荐系统 毕业设计 250623
  • (附源码)计算机毕业设计SSM基于java的云顶博客系统
  • (五)大数据实战——使用模板虚拟机实现hadoop集群虚拟机克隆及网络相关配置
  • (一)基于IDEA的JAVA基础12
  • (一)十分简易快速 自己训练样本 opencv级联haar分类器 车牌识别
  • (转)memcache、redis缓存
  • (转)可以带来幸福的一本书
  • .NET Core 控制台程序读 appsettings.json 、注依赖、配日志、设 IOptions
  • .NET 自定义中间件 判断是否存在 AllowAnonymousAttribute 特性 来判断是否需要身份验证