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


Posted in Python onOctober 15, 2020

数据分析师肯定每天都被各种各样的数据数据报表搞得焦头烂额,老板的,运营的、产品的等等。而且大部分报表都是重复性的工作,这篇文章就是帮助大家如何用Python来实现报表的自动发送,解放你的劳动力,可以让你有时间去做更有意思的事情。

首先来介绍下实现自动报表要使用到的Python库:

pymysql 一个可以连接MySQL实例并且实现增删改查功能的库
datetime Python标准库中自带的关于时间的库
openpyxl 一个可以读写07版以后的Excel文档(.xlsx格式也支持)的库
smtplib SMTP即简单邮件传输协议,Python简单封装成了一个库
email 一个用来处理邮件消息的库
为什么使用openpyxl库来处理Excel呢?因为它支持每个sheet的行数为100W+,也是支持xlsx格式的文件。如果你接受xls文件,并且每个sheet的行数小于6W,也是可以使用xlwt库,它对大文件的读取速度要大于openpyxl。

接下来我们就进入实战部分,来正式实现这个过程。我把整个实现过程分成几个函数的方式来实现,这样看着会比较有结构感。

一、首先导入所有要用到的库

# encoding=utf-8
import pymysql as pms
import openpyxl
import datetime
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.header import Header
import smtplib

二、 编写一个传入sql就返回数据的函数get_datas(sql)

def get_datas(sql):
  # 一个传入sql导出数据的函数
  # 跟数据库建立连接
  conn = pms.connect(host='实例地址', user='用户',
            passwd='密码', database='库名', port=3306, charset="utf8")
  # 使用 cursor() 方法创建一个游标对象 cursor
  cur = conn.cursor()
  # 使用 execute() 方法执行 SQL
  cur.execute(sql)
  # 获取所需要的数据
  datas = cur.fetchall()
  #关闭连接
  cur.close()
  #返回所需的数据
  return datas

三、 编写一个传入sql就返回数据的字段名称的函数get_datas(sql),因为一个函数只能返回一个值,这边就用2个函数来分别返回数据和字段名称(也就是excel里的表头)

def get_fields(sql):
  # 一个传入sql导出字段的函数
  conn = pms.connect(host='rm-rj91p2yhl9dm2xmbixo.mysql.rds.aliyuncs.com', user='bi-analyzer',
            passwd='pcNzcKPnn', database='kikuu', port=3306, charset="utf8")
  cur = conn.cursor()
  cur.execute(sql)
  # 获取所需要的字段名称
  fields = cur.description
  cur.close()
  return fields

四、 编写一个传入数据、字段名称、存储地址返回一个excel 的函数et_excel(data, field, file)

def get_excel(data, field, file):
  # 将数据和字段名写入excel的函数
  #新建一个工作薄对象
  new = openpyxl.Workbook()
  #激活一个新的sheet
  sheet = new.active
  #给sheet命名
  sheet.title = '数据展示'
  #将字段名称循环写入excel第一行,因为字段格式列表里包含列表,每个列表的第一元素才是字段名称
  for col in range(len(field)):
    #row代表行数,column代表列数,value代表单元格输入的值,行数和列数都是从1开始,这点于python不同要注意
    _ = sheet.cell(row=1, column=col+1, value=u'%s' % field[col][0])
   #将数据循环写入excel的每个单元格中  
  for row in range(len(data)):
    for col in range(len(field)):
      #因为第一行写了字段名称,所以要从第二行开始写入
      _ = sheet.cell(row=row+2, column=col + 1, value=u'%s' % data[row][col])
      #将生成的excel保存,这步是必不可少的
  newworkbook = new.save(file)
  #返回生成的excel
  return newworkbook

五、 编写一个自动获取昨天日期字符串格式的函数getYesterday()

def getYesterday():
  # 获取昨天日期的字符串格式的函数
  #获取今天的日期
  today = datetime.date.today()
  #获取一天的日期格式数据
  oneday = datetime.timedelta(days=1)
  #昨天等于今天减去一天
  yesterday = today - oneday
  #获取昨天日期的格式化字符串
  yesterdaystr = yesterday.strftime('%Y-%m-%d')
  #返回昨天的字符串
  return yesterdaystr

六、编写一个生成邮件的函数create_email(email_from, email_to, email_Subject, email_text, annex_path, annex_name)

def create_email(email_from, email_to, email_Subject, email_text, annex_path, annex_name):
  # 输入发件人昵称、收件人昵称、主题,正文,附件地址,附件名称生成一封邮件
  #生成一个空的带附件的邮件实例
  message = MIMEMultipart()
  #将正文以text的形式插入邮件中
  message.attach(MIMEText(email_text, 'plain', 'utf-8'))
  #生成发件人名称(这个跟发送的邮件没有关系)
  message['From'] = Header(email_from, 'utf-8')
  #生成收件人名称(这个跟接收的邮件也没有关系)
  message['To'] = Header(email_to, 'utf-8')
  #生成邮件主题
  message['Subject'] = Header(email_Subject, 'utf-8')
  #读取附件的内容
  att1 = MIMEText(open(annex_path, 'rb').read(), 'base64', 'utf-8')
  att1["Content-Type"] = 'application/octet-stream'
  #生成附件的名称
  att1["Content-Disposition"] = 'attachment; filename=' + annex_name
  #将附件内容插入邮件中
  message.attach(att1)
  #返回邮件
  return message

七、 生成一个发送邮件的函数send_email(sender, password, receiver, msg)

def send_email(sender, password, receiver, msg):
  # 一个输入邮箱、密码、收件人、邮件内容发送邮件的函数
  try:
    #找到你的发送邮箱的服务器地址,已加密的形式发送
    server = smtplib.SMTP_SSL("smtp.mxhichina.com", 465) # 发件人邮箱中的SMTP服务器
    server.ehlo()
    #登录你的账号
    server.login(sender, password) # 括号中对应的是发件人邮箱账号、邮箱密码
    #发送邮件
    server.sendmail(sender, receiver, msg.as_string()) # 括号中对应的是发件人邮箱账号、收件人邮箱账号(是一个列表)、邮件内容
    print("邮件发送成功")
    server.quit() # 关闭连接
  except Exception:
    print(traceback.print_exc())
    print("邮件发送失败")

八、建立一个main函数,把所有的自定义内容输入进去,最后执行main函数

def main():
  print(datetime.datetime.now())
  my_sql = sql = "SELECT a.id '用户ID',\
      a.gmtCreate '用户注册时间',\
      af.lastLoginTime '最后登录时间',\
      af.totalBuyCount '历史付款子单数',\
      af.paidmountUSD '历史付款金额',\
      af.lastPayTime '用户最后支付时间'\
     FROM table a\
   LEFT JOIN tableb af ON a.id= af.accountId ;"
  # 生成数据
  my_data = get_datas(my_sql)
  # 生成字段名称
  my_field = get_fields(my_sql)
  # 得到昨天的日期
  yesterdaystr = getYesterday()
  # 文件名称
  my_file_name = 'user attribute' + yesterdaystr + '.xlsx'
  # 文件路径
  file_path = 'D:/work/report/' + my_file_name
  # 生成excel
  get_excel(my_data, my_field, file_path)

  my_email_from = 'BI部门自动报表机器人'
  my_email_to = '运营部'
  # 邮件标题
  my_email_Subject = 'user' + yesterdaystr
  # 邮件正文
  my_email_text = "Dear all,\n\t附件为每周数据,请查收!\n\nBI团队 "
  #附件地址
  my_annex_path = file_path
  #附件名称
  my_annex_name = my_file_name
  # 生成邮件
  my_msg = create_email(my_email_from, my_email_to, my_email_Subject,
             my_email_text, my_annex_path, my_annex_name)
  my_sender = '阿里云邮箱'
  my_password = '我的密码'
  my_receiver = [10001@qq.com']#接收人邮箱列表
  # 发送邮件
  send_email(my_sender, my_password, my_receiver, my_msg)
  print(datetime.datetime.now())

if __name__ == "__main__":
  main();

以上就是如何使用Python自动生成报表并以邮件发送的详细内容,更多关于python 生成报表邮件发送的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
Python上传package到Pypi(代码简单)
Feb 06 Python
使用Mixin设计模式进行Python编程的方法讲解
Jun 21 Python
Python使用plotly绘制数据图表的方法
Jul 18 Python
对Python中type打开文件的方式介绍
Apr 28 Python
python用BeautifulSoup库简单爬虫实例分析
Jul 30 Python
python定时复制远程文件夹中所有文件
Apr 30 Python
PyCharm 创建指定版本的 Django(超详图解教程)
Jun 18 Python
python自动化测试之如何解析excel文件
Jun 27 Python
Python学习笔记之Django创建第一个数据库模型的方法
Aug 07 Python
Python enumerate() 函数如何实现索引功能
Jun 29 Python
一篇文章教你用python画动态爱心表白
Nov 22 Python
利用Python实现学生信息管理系统的完整实例
Dec 30 Python
如何在Win10系统使用Python3连接Hive
Oct 15 #Python
Python进行特征提取的示例代码
Oct 15 #Python
Python通过递归函数输出嵌套列表元素
Oct 15 #Python
Python安装第三方库攻略(pip和Anaconda)
Oct 15 #Python
Python return语句如何实现结果返回调用
Oct 15 #Python
python 进程池pool使用详解
Oct 15 #Python
python 输入字符串生成所有有效的IP地址(LeetCode 93号题)
Oct 15 #Python
You might like
php 各种应用乱码问题的解决方法
2010/05/09 PHP
PHP 获取MySQL数据库里所有表的实现代码
2011/07/13 PHP
php常用Stream函数集介绍
2013/06/24 PHP
php无限极分类递归排序实现方法
2014/11/11 PHP
Zend Framework生成验证码并实现验证码验证功能(附demo源码下载)
2016/03/22 PHP
基于node.js的快速开发透明代理
2010/12/25 Javascript
仅img元素创建后不添加到文档中会执行onload事件的解决方法
2011/07/31 Javascript
鼠标移入移出事件改变图片的分辨率的两种方法
2013/12/17 Javascript
2014 HTML5/CSS3热门动画特效TOP10
2014/12/07 Javascript
详解JavaScript中的客户端消息框架设计原理
2015/06/24 Javascript
ES6新数据结构Set与WeakSet用法分析
2017/03/31 Javascript
vue.js选中动态绑定的radio的指定项
2017/06/02 Javascript
vue cli使用绝对路径引用图片问题的解决
2017/12/06 Javascript
理解Koa2中的async&await的用法
2018/02/05 Javascript
VUE2.0+ElementUI2.0表格el-table循环动态列渲染的写法详解
2018/11/30 Javascript
有关vue 开发钉钉 H5 微应用 dd.ready() 不执行问题及快速解决方案
2020/05/09 Javascript
JavaScript中数组去重的5种方法
2020/07/04 Javascript
[49:13]DOTA2上海特级锦标赛C组资格赛#1 OG VS LGD第一局
2016/02/27 DOTA
深入解读Python解析XML的几种方式
2016/02/16 Python
python3.5实现socket通讯示例(TCP)
2017/02/07 Python
Python3.6日志Logging模块简单用法示例
2018/06/14 Python
解决Python安装时报缺少DLL问题【两种解决方法】
2019/07/15 Python
python使用配置文件过程详解
2019/12/28 Python
matplotlib jupyter notebook 图像可视化 plt show操作
2020/04/24 Python
Python 排序最长英文单词链(列表中前一个单词末字母是下一个单词的首字母)
2020/12/14 Python
css3实现顶部社会化分享按钮示例
2014/05/06 HTML / CSS
简单几步用纯CSS3实现3D翻转效果
2019/01/17 HTML / CSS
欧洲最大的笔和书写专家:The Pen Shop
2017/03/19 全球购物
公务员转正鉴定材料
2014/02/11 职场文书
成人继续教育实施方案
2014/03/01 职场文书
市场营销计划书
2015/01/17 职场文书
高中生打架检讨书1000字
2015/02/17 职场文书
女性健康知识讲座通知
2015/04/23 职场文书
新年晚会主持词开场白
2015/05/28 职场文书
运动会通讯稿200字
2015/07/20 职场文书
2016七一建党节慰问信
2015/11/30 职场文书