相信大家经常在工作中见到一些数据报告,比如周报啊,月报啊,绩效考核表之类的数据表格,这些表格每个月我们都需要发送给固定的人,比如领导,对于这些报告,有的需要手工导入数据,而有的其实都是一些固定数据,所以我就针对相对固定的数据来进行分析,如何让程序自动生成绩效考核表并发送邮件给领导。项目思路如下(列表页无法查看flowchart,详情页正常):

首先利用python的openpyxl库获取表格内容,然后同样适用该库对数据进行修改,修改日期为当前日期。修改好之后保存一份;然后利用email库发送带有附件的邮件,最后再利用电脑或者服务器的定时任务执行当前脚本即可。下面是源码:

获取表格/修改数据

利用openpyxl.load_workbook函数导入表格,然后读取sheet。利用cell函数修改指定行的内容,比如下方我修改了第2行,第8列的数据,将日期修改成了当前日期,然后最后保存到了本地。

# _*_ coding:utf-8 _*_
import openpyxl
import time
import smtplib
from email.mime.text import MIMEText
from email.header import Header
from email.utils import formataddr
from email.mime.multipart import MIMEMultipart
# 通过openpyxl与time库修改绩效表中日期为当前时间
def write_excel():
# 读取excel
wb = openpyxl.load_workbook('jixiaokaohe.xlsx')
worksheet = wb['sheet名称']
# 修改指定行数据并保存到本地
worksheet.cell(2, 8, str(time.strftime('%Y.%m.%d', time.localtime())))
wb.save(filename='jixiaokaohe.xlsx')

发送邮件

# 发送邮件
def send_email():
from_addr = 'email@domain.com'
password = 'thisispassword'
to_addr = 'receive@domain.com'
smtp_server = 'smtp.exmail.qq.com'
# 创建一个带附件的实例
msg = MIMEMultipart()
msg['From'] = Header("发送者名称", 'utf-8')
msg['To'] = Header("接受者名称", 'utf-8')
subject = '邮件标题'
msg['Subject'] = Header(subject, 'utf-8')
# 邮件正文内容
msg.attach(MIMEText("你好:
详情见附件!
", 'html', 'utf-8')) 
# 构造附件1
att1 = MIMEText(open('jixiaokaohe.xlsx', 'rb').read(), 'base64', 'utf-8')
# 这里的filename可以任意写,写什么名字,邮件中显示什么名字
att1["Content-Disposition"] = 'attachment; filename="jixiaokaohe.xlsx"'
msg.attach(att1)
# 服务端配置,账密登陆
server = smtplib.SMTP(smtp_server, 25)
# 登陆服务器
server.login(from_addr, password)
try:
server.sendmail(from_addr, [to_addr], msg.as_string()) # 发送地址需与登陆的邮箱一致
print("邮件发送成功!")
server.quit()
except smtplib.SMTPException:
print("Error: 无法发送邮件")
def start():
write_excel()
send_email()
start()

到这里为止,脚本就写完了,写起来很简单,最后一步就是找个合适的时候执行这个脚本,没有服务器的,可以用自己本机电脑做一个定时计划任务,然后定时执行该脚本即可。

st=>start: 开始
e=>end: 结束
op1=>operation: 获取表格
op2=>operation: 修改表格
op3=>operation: 发送邮件
st->op1(right)->op2(right)->op3->e{"theme":"simple","scale":1,"line-width":2,"line-length":50,"text-margin":10,"font-size":12}