我帮公司财务写了个“群发工资条”的Python脚本
作者 | 黄伟呢
来源 | 数据分析与统计学之美
介绍
这是一个很好的Python自动化的案例。对于小公司,采用手动方式一个个发送邮件还是可以的。如果一个上百号,上千号,或者更大规模的公司,我们再一个个发送工资条邮件,就太浪费时间了。鉴于此,我写了一个这样的程序,实现Python自动化群发工资条的功能。
原始数据源如下:
最终效果如下:
看到这里,你肯定也觉得很好玩儿吧?那么这样一个自动化程序,应该怎么做呢?接着往下看。
流程分析
其实这样一个代码,总结下来,就只有如下5步:
① 导入相关模块;
② 读取Excel表格;
③ 登录邮箱;
④ 准备要发送的邮件正文;
⑤ 发送邮件;
1)导入相关模块
from openpyxl import load_workbook # 用于操作Excel的模块
import yagmail # 用于存储邮箱地址和密码的模块
import keyring # 用于记录你邮箱地址和密码的模块
from datetime import * # 用于获取当前系统时间的模块
2)读取Excel表格
# 加载Excel文件
wb = load_workbook("群发工资条.xlsx",data_only=True)
sheet = wb.active
print(sheet)
-------------------------------------------------------
for row in sheet:row_text = ""for cell in row:if cell.column == "B":continuerow_text += f"{cell.value},"print(row_text)
------------------------------------------------------
print("年:", date.today().year)
print("月:", date.today().month)
print(f"{date.today().year}-{date.today().month}月")
结果如下:
3)登录邮箱
yagmail.register("1127421544@qq.com","flmyucvntuvbjbcb")
pwd = keyring.get_password("yagmail","1127421544@qq.com")
yag = yagmail.SMTP(user="1127421544@qq.com",host="smtp.qq.com",password=pwd)
需要注意的是:第一行代码是用于存储你的邮件地址和密码。第二行代码使用keyring是为了记录你的邮件地址和密码。第三行代码直接登录邮箱。
关于Python怎么发送邮件,我之前写了一篇文章,进行了详细的介绍,下方是这篇文章的链接,大家可以参考。
Python发邮件:http://suo.im/60ylZ1
4)准备要发送的正文
由于发送的正文里面,需要我们发送一个带表格的邮件,这就有必要我们了解一点前端知识。因此,我在最后面花一个章节为大家讲解。
5)发送邮件
yag.send(f"{email}",f"数据分析与统计学之美有限公司{date.today().year}-{date.today().month}月工资情况",contents)
上述代码共有3个参数:第一个参数是收件人的邮箱;第二个参数是邮件的标题;第三个参数是发送的内容。
关于html代码的特别说明
会用Python发送邮件的人都知道,邮件正文内容可以写html代码。你可能觉得自己啥也不会,但是不用担心,我们不需要学习太高深的前端代码,做过爬虫的人耳濡目染,都能够看懂一些。
1)自己写一个简单的前端代码
我们可以直接用Pycharm创建一个新的html文件,里面会显示初始的前端代码,我们进行简单的添加,就可以获得一个表格啦!
最终在浏览器中显示效果如下:
从上图中根本看不出这是一个表格,那是因为我们没有为它设置一个样式,下面要做的就是为表格设置样式。
最终在浏览器中显示效果如下:
2)在Python中怎么写前端代码
从上图可以看出,整个前端代码就是用一些列的标签组成,同时标签都是成对出现的。因此,在Python中写前端代码时,只需要在对应位置添加对应的标签即可。
for row in sheet:row_text = "<tr>"for cell in row:if cell.column == "B":continuerow_text += f"<td>{cell.value}</td>"row_text += "</tr>"print("\n")print(row_text)
结果如下:
完整代码
完整代码获取:https://pan.baidu.com/s/1oE18u7deeztHCGPIApaVkA
提取码:3wd1
推荐阅读
用Bi-GRU语义解析,实现中文人物关系分析
我还没考试,算法就说我的物理一定挂科
假如,微软断供了怎么办?
Python再夺冠,上古语言COBOL大流行,IEEE Spectrum 2020年度编程语言排行榜出炉!
中台架构详解(上) | 大咖说中台
相关文章:

[转] vim的复制粘贴小结
转载自: http://blogread.cn/it/article.php?id304 用vim这么久了,始终也不知道怎么在vim中使用系统粘贴板,通常要在网上复制一段代码都是先gedit打开文件,中键粘贴后关闭,然后再用vim打开编辑,真的不爽;上…

CCNA基础 IP地址子网划分
例:1.2.3.4/28 解析0:https://ws2.sinaimg.cn/large/006aKfj6jw1fa09e02m53j30u01hc7av.jpg 解析1:子网数量:2^n-x ( N表示 "/" 后面的数字;X表示8或16或24 ) (子网数量需要减去8或16视情况决…

一位IT從業人員的心路歷程
一位IT從業人員的心路歷程作者:章立民「Statgraphics統計繪圖入門詳論」是我的第一本著作,時值1990年9月,當時我還是一位大三升大四的學生。屈指算算,14年來,我已經撰寫了60本以上的書籍(簡體版未計算在內),…
面了大厂的 Python 岗后,炸了!
听说 Python 很难学?难在哪里?听说学完不知道做什么,为什么?结合我最近这些年的 Python 学习、开发经验,发现 90% 的人在初学 Python 时都会遇到下面这些问题——1. 没经验根本不知道从何学起,而且应用方向…

{} 与 function() { } , 选用空对象{}来存放keyValue
虽说js里面什么都能当对象,也能用填鸭式方法任意给对象添加属性,属性赋值.但是有些js内置的对象,类型属性也是没办法覆盖的。 贪多必失,写了一个用操作url 的js工具类,这个类上面有个属性叫queryString,我原…

java/android 设计模式学习笔记(1)--- 单例模式
前段时间公司一些同事在讨论单例模式(我是最渣的一个,都插不上嘴 T__T ),这个模式使用的频率很高,也可能是很多人最熟悉的设计模式,当然单例模式也算是最简单的设计模式之一吧,简单归简单&#…

实例解说.Net构架下的加密编程
yesky(张悦■yesky) http://www.yesky.com/SoftChannel/72342380484755456/20031225/1756613.shtml 很久以前就一直想写一个加密程序,但是一直感到太麻烦而没有动手,不过在前段时间学习.NET的过程中发现.NET的框架中封装了与加密有关的类。而且要在.NE…
人工智能新手入门学习路线!附学习资源合集
有段时间没跟大家分享编程资源福利了!今天为大家整理了人工智能新手入门学习路线,同时附700分钟的学习资源合集,相信这套福利可以帮你顺利入行AI!文末领取全部资料。一、AI基础好课学习资料整理(约317分钟)…

数据还原到指定时间点的处理示例
--创建测试数据库CREATE DATABASE DbGO--对数据库进行备份BACKUP DATABASE Db TO DISKc:\db.bak WITH FORMATGO--创建测试表CREATE TABLE Db.dbo.TB_test(ID int)--延时1秒钟,再进行后面的操作(这是由于SQL Server的时间精度最大为百分之三秒,不延时的话,可能会导致还原到时间点…

kvm cpu的亲和性绑定配置
1.CPU的绑定配置进程的处理器亲和性(process affinity):指将进程绑定到特定的一个或多个cpu上去执行,而不允许将进程调度到其他cpu上。物理cpu:表示真实的cpu个数逻辑cpu:表示所有拥有一个完整真实cpu功能的…
李开复对话Yoshua Bengio:AI技术的下一个突破
7月23日,在SGInnovate主办的“深度科技(Deep Tech)造福人类”活动上,创新工场董事长兼CEO李开复与Element AI联合创始人Yoshua Bengio进行了一场对话,讨论了人工智能的未来发展。Yoshua Bengio是深度学习三大发明人之一…

单链表功能大全
单链表很全的例子,增加,删除,排序,都有了 #include <stdio.h>#include <stdlib.h>typedef struct node{int nDate;struct node *pstnext;}Node;//链表输出void output(Node *head){Node *p head->pstnext;while(N…

Access外键 级联更新、删除
工具栏-->"关系"。 打开主表和从表。 将主表的字段拖动到从表的对应字段。 (两个字段要求类型相同。 如果主表是自动编号,那么从表用长整型.) Access添加外键约束(1)"实施完整性约束"(2)"左联接"(3)"实…

20161124网络爬虫技术学习
参考书籍:《自己动手写网络爬虫》 网络爬虫的基本操作是抓取网页。 “打开”网页的过程其实就是浏览器作为一个浏览的“客户端”,向服务器端发送了一次请穷求,把服务器端的文件“抓”到本地,再进行解释,展现。更进一步…

关于何种情况下使用DataGrid、DataList或Repeater的一些讨论
作者:Scott Mitchell [概述] WEB开发自从有了基于脚本的WEB编程技术(如ASP)以来,经历了一个漫长的过程。通过使用微软的ASP.Net技术,传统的ASP中大量的、单调乏味的、重复性的编程工作成为了历史…

UDP客户端不用绑定吗IP和端口?
2019独角兽企业重金招聘Python工程师标准>>> 书上都是这么说的,UDP客户端不用绑定IP和端口,操作系统会给它自动分配端口。。。。 但是虽然没有显示绑定,但是操作系统却似乎做了些隐蔽的事情。 首先,在客户端࿰…
算法实现太难了?机器学习也需要开源软件
作者 | Soren Sonnenburg等译者 | 刘畅出品 | AI科技大本营(ID:rgznai100)导读:开源工具已经趋于成熟,这使其能构建大规模的自然场景下的系统。与此同时,机器学习领域为各种应用开发了大量强大的学习算法。但是&#x…

数据库备份定期删除程序的开发。
第一.最近客户的服务器数据库备份每天都在进行,随着数据量的不断的增加,备份也在不断的进行变大。 第二.于是一些问题就出现了客户的服务器的磁盘的空间有限,定期数据库备份文件太大而导致无法进行保存问题。 第三.从而导致了服务器宕机以及服…

Repeater控件的分页问题
作者:zhoubinmail.sdu.edu.cn以前做ASP的时间不算短,可是做ASP.NET我是个新手。前几天做项目,遇到一个问题,要求比较复杂的数据格式显示,用DataGrid非常难实现,后来改用了Repeater控件来实现。不过这样就带…
华为昇腾AI全栈知识深入解读,师资培训沙龙深圳场圆满落幕!
头图 | 视觉中国极度缺乏AI人才,已成为中国人工智能产业发展道路上的瓶颈。在国家政策的支持下,众高校初建AI专业者甚多,但高校教师应掌握哪些知识储备来传道授业,大家都是“摸着石头过河”。将高校AI人才培养教学大纲与厂商成熟落…

[转载] 信息系统项目管理师考试论文写作要点
来源:信管网 网址:http://www.cnitpm.com/pm/4323.html (1)在论文写作之前,先不要急着动笔,认真把题看清楚,选择自己熟悉的论文(考试时,一般是二选一)&#x…

POM.xml 标签详解
pom作为项目对象模型。通过xml表示maven项目,使用pom.xml来实现。主要描述了项目:包括配置文件;开发者需要遵循的规则,缺陷管理系统,组织和licenses,项目的url,项目的依赖性,以及其他…

DataRow的序列化问题
来源:CSDN 作者:kroll 在.net里,DataRow类型的对象是不支持序列化的,那么如果在一个需要序列化的对象中含有DataRow类型的字段该怎么办呢?呵呵,幸好Datatable是支持序列化的。因此,我们可以自定…

mass Framework event模块 v4
event.js // // 事件模块(包括伪事件对象,事件绑定与事件代理) // $.define("event",document.dispatchEvent ? "node" : "node,event_fix",function(){// $.log("已加载target模块")var rhoverH…
美国 AI 博士:什么都不会怎么学 Python?
我见过市面上很多的 Python 讲解教程和书籍,他们大都这样讲 Python 的:先从 Python 的发展历史开始,介绍 Python 的基本语法规则,Python 的 list, dict, tuple 等数据结构,然后再介绍字符串处理和正则表达式࿰…

puppet 初识
【puppet初识】学习目录 领导说saltstack太慢 机器量一旦上来,saltstack就力不从心,所以要将saltstack转向puppet。【安装背景】系统centos 6.5软件地址:http://downloads.puppetlabs.com/puppet/master: 192.168.100.10agent: 192.168.100.13因为puppe…

ColorMatrix 彩色矩阵
选择自 hbzxf 的 Blog 首先对装配脑袋给出上两片文章的友好回复,还有网友Fisherman一起探讨ColorMatrix话题表示感谢!ColorMatrix (彩色矩阵) 类位于System.Drawing.Imaging命名空间 先看看下面的代码 ColorMatrix cm newColorMatrix(newfloat[][]{ n…
一个参数一张Excel表,玩转Pandas的read_excel()表格读取
作者 | 黄伟呢来源 | 数据分析与统计学之美我觉得很有必要讲述这个文章,进行数据处理的第一步就是Python数据读取。但是你可能没想到,在进行数据读取的同时,我们其实可以配合相关参数做很多事儿,这对于后续的数据处理都是极其有帮…

Android 设计模式:(三)装饰者模式 —— 装饰对象
*利用组合(composition)和委托(delegation)可以在运行时实现继承行为的效果,动态地给对象加上新的行为。*利用继承扩展子类的行为,是在编译时静态决定的;利用组合的做法,可以在运行时…

润乾报表永久授权说明
永久授权是什么? 永久授权是运行润乾报表的带有机器特征码的没有时间限制的正式授权文件 2 机器特征码是什么? 机器特征码是为了制作永久授权,由润乾公司提供程序从用户的服务器上获取硬件和操作系统信息,生成的一个数字串&#x…