Py学习  »  Python

用Python批量发工资邮件

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

项目说明

每家公司每个月都要向员工发送一次工资邮件。通常的做法是,财务主管提供一个工资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/108479
 
234 次点击