Python办公自动化|批量生成请假条

news2024/12/24 9:37:45

大家好,我是毕加锁

本文就将基于一个真实的办公案例进行讲解如何提取Excel内容并创建Word,主要将涉及以下三个知识点

  1. openpyxl 读取 Excel 文件

  2. python-docx 写入 Word 文件

  3. python-docx 各类样式的设计和调整

需求描述

你是公司的底层小虾米,前段时间收集了公司各个部门的请假信息汇总表如下:

现在你需要根据表格中每个人的信息依次生成各自的请假条如下:

需求的特殊性在于没有现成的模板,因此需要在代码中同时完成模板的制作和文字、段落样式设计。

比较复杂的文字版面更建议直接设计好模板,以及确定好程序识别位置的定位符,详细内容可以参考之前的教程:批量生成合同

逻辑分析

整个需求的实现逻辑很简单,主要分为以下 2 步:

  • 获取 Excel 文件中每一行的信息,提取 5 个参数;

  • 结合获取的参数设计请假条样式并输出

逻辑并不困难,但是复杂的地方在于用代码输出请假条的过程,包括加粗、字号、下划线等等。

代码实现

需求中的请假信息汇总表为 Leave.xlsx,已放链接供练习下载 首先读取请假信息表,尝试获取除表头外实际信息的 5 个参数:

from openpyxl import load_workbook

path = r'C:\xxx' # 路径为Excel 文件所在的位置,可按实际情况更改
workbook = load_workbook(path + r'\Leave.xlsx')
sheet = workbook.active

n = 0
for row in sheet.rows:
    if n:
        for cell in row:
            print(cell.value)
    n += 1

通过 for row in sheet.rows 和 for cell in row 就可以迭代 Excel 中有数据的每个单元格了。

循环体中加上对 n 的判断是为了跳过表头 如果让输出更加直观可以稍微修改上面的代码:

n = 0
for row in sheet.rows:
    if n:
        for cell in row:
            print(cell.value, end=', ')
        print('')
    n += 1

信息已经获取到了,但我们也发现申请日期是 datetime 形式,因此我们需要利用 datetime 库获取其中的日期成分,也可以转化为字符串后利用空格切片:

n = 0
for row in sheet.rows:
    if n:
        name = row[0].value
        department = row[1].value
        reason = row[2].value
        days = row[3].value
        date = str(row[4].value).split()[0]
        print(name, department, reason, days, date)
    n += 1

提取到信息后就可以在循环体内建立个“请假条函数”,即把每条记录的 5 个变量传入函数,在函数中生成完整请假条并保存,即修改成如下形式:

def request_for_leave(name, department, reason, days, date):
    pass

n = 0
for row in sheet.rows:
    if n:
        name = row[0].value
        department = row[1].value
        reason = row[2].value
        days = row[3].value
        date = str(row[4].value).split()[0]
        request_for_leave(name, department, reason, days, date)
    n += 1

生成请假条中,首先导入依赖的库 python-docx 以及跟样式设置有关的相应方法:

# 读取 Word 文件
from docx import Document
# 文件涉及段落样式修改
from docx.enum.text import WD_PARAGRAPH_ALIGNMENT
# 文件涉及文字样式修改:颜色修改、字号调整
from docx.shared import RGBColor, Pt
# 设置中文字体
from docx.oxml.ns import qn

接下来就是依次添加各部分的内容和样式,因为全文的字体均为楷体,可以在函数体的最末尾一并修改。首先实例化文件后添加“请假条”:

def request_for_leave(name, department, reason, days, date):
    doc = Document()
    heading_1 = '请 假 条'
    paragraph_1 = doc.add_heading(heading_1, level=1)
    # 居中对齐
    paragraph_1.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER
    # 标题要打,单独修改较大字号
    for run in paragraph_1.runs:
        run.font.size = Pt(17)

如果对上面的代码单独输出会发现标题颜色是蓝色,这是以 .add_heading() 添加标题默认的颜色。

最后也可以统一修改 对于“尊敬的领导:”这一行基本同理,但不需要修改字号:

    greeting_word = '尊敬的领导:'
    paragraph_2 = doc.add_paragraph(greeting_word)

接下来是核心请假条的正文了,从需求中的样式上可以看出,整句话中有一些文字块是固定的,包括 “本人” “、所在部门” “,由于” “需请假” “天。”,而几个文字块之间的信息是根据不同人的情况而不同,并且需要添加下划线

简单的逻辑就是将参数对应的文字块添加好下划线之后,和固有不变的变量进行拼接,就可以形成完整的段落了:

    word_1 = "    本人"
    word_2 = ",所在部门"
    word_3 = ",由于"
    word_4 = ",需请假"
    word_5 = "天。"

    paragraph_3 = doc.add_paragraph()
    paragraph_3.add_run(word_1)
    paragraph_3.add_run(name).underline = True
    paragraph_3.add_run(word_2)
    paragraph_3.add_run(department).underline = True
    paragraph_3.add_run(word_3)
    paragraph_3.add_run(reason).underline = True
    paragraph_3.add_run(word_4)
    paragraph_3.add_run(str(days)).underline = True
    paragraph_3.add_run(word_5)
    # 设置下划线
    paragraph_3.paragraph_format.line_spacing = 1.5

代码中 .underline = True 就是对参数对应的文字块添加下划线 接下来的申请人和日期填写就和上面基本类似。

比较大的区别在于添加了一行新的命令 paragraph.alignment = WD_PARAGRAPH_ALIGNMENT.RIGHT, 这行命令能够将这两个段落右对齐

    word_6 = '申请人:'
    paragraph_4 = doc.add_paragraph()
    paragraph_4.add_run(word_6)
    paragraph_4.add_run(name).underline = True
    paragraph_4.alignment = WD_PARAGRAPH_ALIGNMENT.RIGHT

    word_7 = '日期:'
    sign_date = "{}年{}月{}日".format(date.split('-')[0], date.split('-')[1], date.split('-')[2])
    paragraph_5 = doc.add_paragraph()
    paragraph_5.add_run(word_7)
    paragraph_5.add_run(sign_date).underline = True
    paragraph_5.alignment = WD_PARAGRAPH_ALIGNMENT.RIGHT

最后就是统一修改字体为楷体,中文字体修改比较麻烦,不像英文字体只需要指定如 run.font.name = 'Arial' 就可以,需要额外的几行代码。最后记得保存:

    for paragraph in doc.paragraphs:
        for run in paragraph.runs:
            # 统一修改颜色
            run.font.color.rgb = RGBColor(0, 0, 0)
            run.font.name = '楷体'
            r = run._element.rPr.rFonts
            r.set(qn('w:eastAsia'), '楷体')

    doc.save(path + "\{}-请假条.docx".format(name))

运行上述代码即可针对每个人产生相应的请假条:

至此,我们就成功利用Python实现了开头的需求,解放双手。注意本案例同样适用于邀请函、证明等各类文书的制作,大家可以举一反三。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/113686.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2022年AIGC简单展望

2022 对于社会是不平凡的一年,而对于科技也同样是不平凡的一年。人们在社会中遭受着失意,却在科技中寻找希冀。对于一个命运共同体,它想着如何破除衰退,而同样对于一个活生生的个体或者家庭,他们也在摸索改变命运的机遇…

SpringBoot拦截器HandlerInterceptor

一、HandlerInterceptor是什么? Spring Boot 拦截器主要应用于登陆校验、权限验证、乱码解决,同样提供了拦截器功能。 二、使用方式 在项目中实现HandlerInterceptor接口开箱即用 三、HandlerInterceptor 中实现的方法 方法介绍preHandle(HttpServletRe…

Linux操作系统之进程间的通讯—管道

文章目录进程间通讯(IPC机制)有哪几种方式?1、管道有名管道无名管道2、信号量进程间通讯(IPC机制)有哪几种方式? 管道、信号量、共享内存、消息队列、套接字 1、管道 什么是管道? 有名管道…

JavaScript 入门基础 - 变量 / 数据类型(二)

JavaScript 入门基础 - 变量 / 数据类型(二) 文章目录JavaScript 入门基础 - 变量 / 数据类型(二)1.变量1.1 什么是变量1.2 变量在内存中的存储1.3 变量的使用1.4 变量语法扩展1.4.1 更新变量1.4.2 声明多个变量1.4.3 声明变量的特…

node.js+uni计算机毕设项目个性化服务系统小程序(程序+小程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程。欢迎交流 项目运行 环境配置: Node.js Vscode Mysql5.7 HBuilderXNavicat11VueExpress。 项目技术: Express框架 Node.js Vue 等等组成,B/S模式 Vscode管理前后端分离等…

一文稿定 Appium 环境配置

Appium 是一个开源的、跨平台的测试框架,可以用来测试 Native App、混合应用、移动 Web 应用(H5 应用)等,也是当下互联网企业实现移动自动化测试的重要工具。Appium 坚持的测试理念: •无需用户对 App 进行任何修改或…

vue后台管理系统项目-vue-quill-editor实现富文本编辑器功能

富文本编辑器功能实现详细过程 目录 富文本编辑器功能实现详细过程 1.安装富文本插件 2.实现效果 3.实现详细过程 可直接使用 全局引入 局部引入 配置option 扩展需求 自定义配置文字大小 1.安装富文本插件 npm install vue-quill-editor --save //或者 yarn add vu…

AI城管自动识别摊贩占道经营出店经营行为

AI城管自动识别摊贩占道经营出店经营行为通过pythonyolov7对现场画面自动AI实时监测,当监测到流动商贩占道经营违规摆摊出店经营时时,立即告警。Python是一种由Guido van Rossum开发的通用编程语言,它很快就变得非常流行,主要是因…

论多窗口相互关联下window.open打开已在的窗口时只激活不刷新的实现方案

前端博主,热衷各种前端向的骚操作,经常想到哪就写到哪,如果有感兴趣的技术和前端效果可以留言~博主看到后会去代替大家踩坑的~ 主页: oliver尹的主页 格言: 跌倒了爬起来就好~ 来个关注吧,点个赞…

Springboot+Netty实现基于天翼物联网平台CTWing(AIOT)终端TCP协议(透传模式)-设备终端(南向设备)

电信的天翼物联网平台CTWing(AIOT)原先是我们俗称的aep,主要用于接入nb-iot设备,当然也可以接入其他的设备,在熟悉AIOT平台后,做后端的我有时候急需终端样品(智能门禁,支付识别终端,CPE终端,考勤…

使用 Swift/SwiftUI 的音频可视化

IOS 应用程序中的音频可视化是一项流行的功能,在实现聊天功能时可能需要它。将它添加到我最近的项目之一时,我个人遇到了一些问题。 你们中的一些人可能在开发包含聊天功能的应用程序时遇到过问题,其中某些消息可能包含音频。这些消息需要在应用程序内进行适当的音频可视化,…

【算法题解】3. 颠倒二进制位

文章目录题目解法一解题思路代码实现复杂度分析解法二解题思路代码实现复杂度分析解法三解题思路代码实现复杂度分析题目 颠倒给定的 32 位无符号整数的二进制位。来自:leetcode 解法一 解题思路 取 n 的最低位,赋值给 ans 的最低位(ans 初…

mybatis 多对一查询的处理方式,1.按照查询嵌套处理(子查询),2、按照结果嵌套处理(连表查询)

多对一查询 1、实体类 Student实体类: public class Student { private int id; private String name; private Teacher teacher;//对象属性}Teacheer 实体类: public class Teacher { private int id; private String name;2、Mybatis配置文件mybatis…

FastDDS(4)安装步骤

eProsima Fast DDS for Linux的最新二进制安装版本可在eProssma网站找到。 eProsima Fast DDSSpecialized on high performance middleware. Check out our comparatives such as Apache Thrift vs Protocol Buffers vs Fast Buffers or ZMQ vs Fast RTPS.https://www.eprosim…

从一道经典题来弄懂Eventloop(搞不懂算我输)

前言 时间不知不觉来到了11月底,马上也要准备一下寒假的实习了。 最近打算把面试中的一些拦路虎给解决掉!! 先拿臭名昭著的Eventloop开刀~ 经典题 async function foo() {console.log(foo) } async function bar() {console.log(bar start…

RabbitMQ:基本消息模型

单生产单消费模型,即基本消息模型或简单消费模型,即完成基本的一对一消息转发。 RabbitMQ 单生产单消费模型主要有以下三个角色构成: 生产者(producer/ publisher):一个发送消息的用户应用程序。消费者&…

JS面试题--JavaScript数据类型

数据类型 1.JavaScript有哪些数据类型,它们的区别? JavaScript共有八种数据类型,分别是 Undefined、Null、Boolean、Number、String、Object、Symbol、BigInt。 其中 Symbol 和 BigInt 是ES6 中新增的数据类型: ● Symbol 代表…

Linux系统基础——程序和进程

代码,程序,进程 特此说明: 刘超的趣谈linux操作系统是比较重要的参考资料,本文大部分内容和图片来源于这个专栏。 1 实验环境 运行一个demo,主要功能是主进程通过系统调用fork一个新的进程,子进程功能是加载二进制文件…

背包模型~

背包模型 概述 ​ 最长上升子序列:序列DP(相邻两个被选择的有关系) 背包问题:组合DP,在全局的考虑之下最小 f[i][j]:i 表示搞了多少,j 表示限制 集合:所有仅仅从前 i 个物品当…

论文推荐:CCNet用于语义分割的交叉注意力

CCNet, Transformer递归交叉自注意力,比非局部神经网络更有效。华中科技大学、地平线、ReLER 和伊利诺伊大学香槟分校联合研发 论文提出了交叉网络 (CCNet),对于每个像素,CCNet 中的一个新的交叉注意力模块收集其交叉路径上所有像…