社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

用Python批量发工资邮件

Python程序员 • 3 年前 • 268 次点击  

项目说明

每家公司每个月都要向员工发送一次工资邮件。通常的做法是,财务主管提供一个工资Excel表,其中每一行对应一个员工的工资,让财务美眉们为每个员工编写一封通知邮件,单独发送给对应的员工。如果公司不到10人还好,要是公司有100人,那财务美眉就要疯掉了。如果这时候你用Python写一个程序,根据Excel内容,自动生成邮件并发送给同事,几分钟帮财务美眉完成工作。那财务美眉必定对你刮目相看,说不定你的桃花运就来了呢!

知识说明

通过这个项目,希望大家学习到如下知识点:

1、熟悉编码和调试的流程,巩固Python基础知识。

2、学会用Python读取Excel中的信息。

3、学会用Python发送邮件。

项目资料

这个项目会用到一个工资Excel表,大家可以从下面地址下载:

长按识别小程序码,进入免费课程下载

下载后,文件名比较长,请将该文件重命名为“wooyide_salary.xlsx”。此表中所有个人信息均为虚构,如需实际发送邮件时,请将其中邮箱替换为自己的邮件地址。

读取Excel中的信息

为了给员工发送工资邮件,我们第一步需要读取工资Excel表内的信息。

读取Excel表文件,我们需要用到一个第三方库“openpyxl”。

安装openpyxl

只需要打开终端,输入下面命令:

py -m pip install openpyxl

看到这样的提示,就说明安装成功了。


开始编码

首先在“wooyide_salary.xlsx”所在文件夹中,创建一个名为“parse_excel.py”的文件,文件内容为:

# 从openpyxl中导入load_workbook
from openpyxl import load_workbook

# 加载excel文件,并将文件对象赋值给变量wb
wb = load_workbook(filename = 'wooyide_salary.xlsx')

# 从wb(一个Excel)中,获取其中一个表格,并将表格赋值给变量sheet
sheet = wb['Sheet1']

# 打印表格中“A1”单元格的内容
print(sheet['A1'].value)

这个文件一共4个语句,其中每个语句的功能都写在语句上方的注释中了,应该很好理解。其中有几个Excel术语:表格、A1单元格,这里我简单解释一下。


表格:每个Excel文件本质上都是一个表格的集合,一个Excel文件中可以有多个表格。Excel文件和表格的关系,类似浏览器和标签页的关系。Excel文件中,你可以点击底部的表格名称来切换表格。

单元格:表格中的一个小格子叫“单元格”。每一个单元格对应一个坐标,横轴的坐标是英文字母,纵轴的坐标是数字(也就是行号)。所以“A1”就是左上角的那个单元格,“C3”就是第三列、第三行的单元格。

上面的脚本中,我们打印出了Excel文件中Sheet1表格的左上角的单元格的内容。

运行这个Python脚本(代码较少的Python项目,我们称之为脚本),终端打印了文字“员工姓名”:

$ py parse_excel.py
员工姓名

获取全部员工工资信息

通过上面的脚本,我们成功获得了一个单元格的内容。为了获得全部员工的信息,我们实际上是要获得以“A2-E2-E4-A4”四个单元格为角的矩形内部的所有单元格的内容。


自然地,我们会直接想到用for循环遍历的形式获取所有单元格内容,像这样:




    
for row in [2, 3, 4]:
print("\n员工工资信息:")
for col in ['A', 'B', 'C', 'D', 'E']:
print(sheet[col + str(row)].value)

其中第二行print的字符串中“\n”是代表换行的意思,以便让每个员工信息之间有一个空行,这样看起来更直观。

运行这段代码,确实能够得到我们期望的输出结果:

员工工资信息:
张三
3276131224@gmail.com
3500
500
4000

员工工资信息:
李四
lovethisworld@hotmail.com
4000
200
4200

员工工资信息:
王二麻子
loveandpeace@facebook.com
2570
400
2970

不过这段代码只能用于员工数量很少的情况,因为我们使用了[2,3,4]这样的固定数组来遍历员工,如果员工有1000人,单写这个数组就会花很长时间。那么如何支持大量员工的情况呢?我们可以用下面代码来代替这个固定数组。

range(2,5)

range是一个Python的内置函数,它可以生成一个可迭代对象,让for循环逐个获取它提供的数字。通俗一点说,就是for循环每执行一次内部代码,都会先从range函数要一个数字,直到range函数没有数字可提供了,for循环就结束了。

以上面这个代码为例,range(2, 5)会依次给for循环提供2,3,4,然后就结束了。注意,不提供5。也就是range提供的数字从第一个参数开始,每次加一,一直提供到第二个参数减一。(用数学化的语言来说,range就是一个区间,两个参数表示的是一个前闭后开的区间。)

这样修改之后,无论有多少员工,我们的代码都能够支持了。

for row in range(2, 5):
print("\n员工工资信息:")
for col in ['A', 'B', 'C', 'D', 'E']:
print(sheet[col + str(row)].value)


未完待续

后面的部分我们放在了“沃依得学堂”中,长按识别下方小程序码,进入学习

长按识别小程序码,进入免费课程学习

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/108578
 
268 次点击