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

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.遍历每个段落中的runs
        for 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"]}的离职证明文件已生成~~~~~')  

http://www.kler.cn/news/325421.html

相关文章:

  • Redis结合Caffeine实现二级缓存:提高应用程序性能
  • 计算机组成原理之数制与编码
  • 交通标志与路面标识检测系统源码分享
  • linux 系统磁盘空间查看与清理
  • 基于nodejs+vue的旅游管理系统
  • 【OS】计算机系统概述|操作系统基本概念|并发|并行|虚拟异步
  • 如何在O2OA中使用ElementUI组件进行审批流程工作表单设计
  • C++:模拟实现vector
  • 2025秋招内推|招联金融
  • 推荐常用的搜索渠道
  • Unity 热更新(HybridCLR+Addressable)-创建Addressable资源
  • H.264与H.265
  • FFmpeg源码:avio_seek函数分析
  • Codeforces Round 301 (Div. 2) C题 Ice Cave(BFS)
  • 昇思MindSpore进阶教程--高级自动微分
  • 基于springboot+小程序的儿童预防接种预约管理系统(疫苗1)(源码+sql脚本+视频导入教程+文档)
  • 依赖倒置原则(学习笔记)
  • PostgreSQL的表碎片
  • 学习Java (五)
  • Go Sonyflake学习与使用
  • 新能源汽车充电桩怎么选?
  • Linux基础(二):磁盘分区
  • js替换css主题变量并切换iconfont文件
  • uniapp中h5环境添加console.log输出
  • 2024年7月大众点评沈阳美食店铺基础信息
  • 数据结构和算法之树形结构(4)
  • springframework Ordered接口学习
  • BOE(京东方)携故宫博物院举办2024“照亮成长路”公益项目落地仪式以创新科技赋能教育可持续发展
  • 计算机网络--TCP、UDP抓包分析实验
  • 2024年配置YOLOX运行环境+windows+pycharm24.0.1+GPU