Python实现自动生成请假条

目录
  • 需求描述
  • 逻辑分析
  • 代码实现

哈喽兄弟们,今天咱们来实现用Python来批量生成请假条,这回既学了东西又做了事情,两不误~

本文就将基于一个真实的办公案例进行讲解如何提取Excel内容并创建Word

主要将涉及以下三个知识点

  • openpyxl 读取 Excel 文件
  • python-docx 写入 Word 文件
  • 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实现了开头的需求,解放双手。注意本案例同样适用于邀请函、证明等各类文书的制作,大家可以多动手试试。

以上就是Python实现自动生成请假条的详细内容,更多关于Python自动生成请假条的资料请关注我们其它相关文章!

(0)

相关推荐

  • 用python自动生成日历

    效果 在Excel日历模板的基础上,生成带有农历日期.节假日.休班等信息的日历,解决DIY日历最大的技术难题. 图中日期,第一行为公历,第二行为节假日,第三行为农历,第四行是其他特别的日子,比如生日.纪念日等. 特点 使用门槛低 Python + Excel,会运行Python脚本,会使用Excel即可上手. 步骤简单 只需要修改Excel的年份(在一月份表头修改),运行一次脚本 可扩展 可制作任意年份的日历(修改年份即可) 可定制 可以添加其他特殊日期 使用手册 第一步,修改日历年份及样式 打

  • 基于Python实现自动化生成数据报表

    目录 前言 开发工具 环境搭建 主要代码 前言 不要在用手敲生成Excel数据报表了,用Python自动生成Excel数据报表!废话不多说 让我们愉快地开始吧~ 开发工具 Python版本: 3.6.4 相关模块: pandasxlwingsmatplotlib模块: xlwingsmatplotlib模块: matplotlib模块: 以及一些Python自带的模块. 环境搭建 安装Python并添加到环境变量,pip安装需要的相关模块即可. 原始数据如下,主要有水果蔬菜名称.销售日期.销售数

  • 利用Python实现自动生成数据日报

    目录 前言 需求详解 数据处理 前言 人生苦短,快学Python! 日报,是大部分打工人绕不过的难题. 对于管理者来说,日报是事前管理的最好抓手,可以了解团队的氛围和状态.可对于员工来说,那就有的聊了.对于重复性的工作,我非常推荐大家使用Python将其变成模块化.自动化,帮助我们实现高效办公. 下面我们通过一个补写销售日报的案例,展示一下Python自动化办公的优势.本文简化了案例的流程. 需求详解 朋友的需求是这样的,他们平时的销售数据是记录在Excel上,汇总后会按照部门进行统计.但是今年

  • 利用Python自动生成PPT的示例详解

    在日常工作中,PPT制作是常见的工作,如果制作创意类PPT,则无法通过自动化的形式生成,因为创意本身具有随机性,而自动化解决的是重复性工作,两者有所冲突. python-pptx是python处理PPT的一个库,注重的是读和写,无法导出,没有渲染功能. 废话不多说,第一步,安装python-pptx库: pip3 install -i https://pypi.doubanio.com/simple/ python-pptx ppt里面处理的主要对象一般为文本框,表格,图片. 每一页的ppt为一

  • Python实现自动生成请假条

    目录 需求描述 逻辑分析 代码实现 哈喽兄弟们,今天咱们来实现用Python来批量生成请假条,这回既学了东西又做了事情,两不误~ 本文就将基于一个真实的办公案例进行讲解如何提取Excel内容并创建Word 主要将涉及以下三个知识点 openpyxl 读取 Excel 文件 python-docx 写入 Word 文件 python-docx 各类样式的设计和调整 需求描述 你是公司的底层小虾米,前段时间收集了公司各个部门的请假信息汇总表如下: 现在你需要根据表格中每个人的信息依次生成各自的请假条

  • 使用python脚本自动生成K8S-YAML的方法示例

    1.生成 servie.yaml 1.1.yaml转json service模板yaml apiVersion: v1 kind: Service metadata: name: ${jarName} labels: name: ${jarName} version: v1 spec: ports: - port: ${port} targetPort: ${port} selector: name: ${jarName} 转成json的结构 { "apiVersion": "

  • 用Python代码自动生成文献的IEEE引用格式的实现

    今天尝试着将引用文献的格式按照IEEE的标准重新排版,感觉手动一条一条改太麻烦,而且很容易出错,所以尝试着用Python写了一个小程序用于根据BibTeX引用格式来生成IEEE引用格式. 先看代码,如下: import re def getIeeeJournalFormat(bibInfo): """ 生成期刊文献的IEEE引用格式:{作者}, "{文章标题}," {期刊名称}, vol. {卷数}, no. {编号}, pp. {页码}, {年份}. :

  • 利用Python实现自动生成图文并茂的数据分析

    目录 前言 1.一行命令,安装这个库 2.核心代码模块导入 ①提前导入相关内容,并且注册字体 ②注册字体 ③生成报告 前言 reportlab是Python的一个标准库,可以画图.画表格.编辑文字,最后可以输出PDF格式.它的逻辑和编辑一个word文档或者PPT很像.有两种方法: 建立一个空白文档,然后在上面写文字.画图等: 建立一个空白list,以填充表格的形式插入各种文本框.图片等,最后生成PDF文档. 因为需要产生一份给用户看的报告,里面需要插入图片.表格等,所以采用的是第二种方法. 1.

  • 详解python脚本自动生成需要文件实例代码

    python脚本自动生成需要文件 在工作中我们经常需要通过一个文件写出另外一个文件,然而既然是对应关系肯定可以总结规律让计算机帮我们完成,今天我们就通过一个通用文件生成的python脚本来实现这个功能,将大家从每日重复的劳动中解放! 定义一个函数 def produceBnf(infilename,outfilename): List=[] with open(infilename,'r') as inf: for line in inf.readlines(): List.append(re.

  • python实现自动生成C++代码的代码生成器

    遇到的问题 工作中遇到这么一个事,需要写很多C++的底层数据库类,但这些类大同小异,无非是增删改查,如果人工来写代码,既费力又容易出错:而借用python的代码自动生成,可以轻松搞定: (类比JAVA中的Hibernate自动生成的数据库底层操作代码) 下面介绍使用python字符串替换的方法: Python字符串替换的几种方法 1. 字符串替换 将需要替换的内容使用格式化符替代,后续补上替换内容: template = "hello %s , your website is %s "

  • Python自动生成代码 使用tkinter图形化操作并生成代码框架

    背景 在写代码过程中,如果有频繁重复性的编码操作,或者可以Reuse的各类代码,可以通过Python写一个脚本,自动生成这类代码,就不用每次手写.或者copy了. 比如新建固定的代码框架.添加一些既定的软件逻辑,通讯协议.消息模板等等,再编写一套代码时,或者一个Function时,每次使通过脚本一键生成代码,就不需要每次都写一遍了,同时可以把相关软件逻辑放进去,也能避免出错. 脚本代码 Demo_CodeGenerator.py 具体详细代码去掉了,大家想生成什么样的代码就在mycode中app

  • 如何使用Python自动生成报表并以邮件发送

    数据分析师肯定每天都被各种各样的数据数据报表搞得焦头烂额,老板的,运营的.产品的等等.而且大部分报表都是重复性的工作,这篇文章就是帮助大家如何用Python来实现报表的自动发送,解放你的劳动力,可以让你有时间去做更有意思的事情. 首先来介绍下实现自动报表要使用到的Python库: pymysql 一个可以连接MySQL实例并且实现增删改查功能的库 datetime Python标准库中自带的关于时间的库 openpyxl 一个可以读写07版以后的Excel文档(.xlsx格式也支持)的库 smt

  • python自动生成证件号的方法示例

    前言 在跟进需求的时候,往往涉及到测试,特别是需要用到身份信息的时候,总绕不开身份证号码这个话题.之前在跟一个互联网产品的时候,需要很多身份证做测试,又不想装太多软件自动生成(有需要的小伙伴可自行搜索身份证号码自动生成软件),按照身份证规则现编也比较浪费时间,在处理身份数据时,Python就非常有用了. 方法示例如下 # Author:BeeLe # -*-coding:utf-8-*- # 生成身份证号码主程序 import urllib.request import requests fro

随机推荐