python生成每日报表数据(Excel)并邮件发送的实例


Posted in Python onFebruary 03, 2019

逻辑比较简单 ,直接上代码 

定时发送直接使用了win服务器的定时任务来定时执行脚本

#coding:utf-8
from __future__ import division
import pymssql,sys,datetime,xlwt 
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.header import Header
 
reload(sys)
sys.setdefaultencoding("utf-8")
 
 
class MSSQL:
  def __init__(self,host,user,pwd,db):
    self.host = host
    self.user = user
    self.pwd = pwd
    self.db = db
 
  def __GetConnect(self):
    if not self.db:
      raise(NameError,"")
    self.conn = pymssql.connect(host=self.host,user=self.user,password=self.pwd,database=self.db,charset="utf8")
    cur = self.conn.cursor()
    if not cur:
      raise(NameError,"")
    else:
      return cur
 
  def ExecQuery(self,sql):
    cur = self.__GetConnect()
    cur.execute(sql)
    resList = cur.fetchall()
 
    #
    self.conn.close()
    return resList
 
  def ExecNonQuery(self,sql):
    cur = self.__GetConnect()
    cur.execute(sql)
    self.conn.commit()
    self.conn.close()
    
  
  def write_data_to_excel(self,name,sql):
 
    # 将sql作为参数传递调用get_data并将结果赋值给result,(result为一个嵌套元组)
    result = self.ExecQuery(sql)
    # 实例化一个Workbook()对象(即excel文件)
    wbk = xlwt.Workbook()
    # 新建一个名为Sheet1的excel sheet。此处的cell_overwrite_ok =True是为了能对同一个单元格重复操作。
    sheet = wbk.add_sheet('Sheet1',cell_overwrite_ok=True)
    # 获取当前日期,得到一个datetime对象如:(2016, 8, 9, 23, 12, 23, 424000)
    today = datetime.date.today()
    yesterday = today - datetime.timedelta(days=1)
    # 将获取到的datetime对象仅取日期如:2016-8-9
    yesterdaytime = yesterday.strftime("%Y-%m-%d")
    # 遍历result中的没个元素。
    for i in xrange(len(result)):
      #对result的每个子元素作遍历,
      for j in xrange(len(result[i])):
        #将每一行的每个元素按行号i,列号j,写入到excel中。
        sheet.write(i,j,result[i][j])
    # 以传递的name+当前日期作为excel名称保存。
    filename = name+str(yesterdaytime)+'.xls'
    wbk.save(filename) 
    return filename
 
 
 
ms = MSSQL(host="122.229.*.*",user="root",pwd="root",db="test")
 
today = datetime.date.today()
yesterday = today - datetime.timedelta(days=1)
yesterdayStart = yesterday.strftime("%Y-%m-%d") + ' 00:00:00'
yesterdayEnd = yesterday.strftime("%Y-%m-%d") + ' 23:59:59'
print yesterdayStart
preCheckCountSuccesSql = "select count(1) FROM tb_crmorders WHERE type =1 and result = 'true' and addtime BETWEEN '" + yesterdayStart +"' and '"+yesterdayEnd + "'";
preCheckUseridSuccesSql = "select count(DISTINCT userid) FROM tb_crmorders WHERE type =1 and result = 'true' and addtime BETWEEN '" + yesterdayStart +"' and '"+yesterdayEnd + "'";
preCheckCountErrorSql = "select count(1) FROM tb_crmorders WHERE type =1 and result = 'false' and addtime BETWEEN '" + yesterdayStart +"' and '"+yesterdayEnd + "'";
preCheckUseridErrorSql = "select count(DISTINCT userid) FROM tb_crmorders WHERE type =1 and result = 'false' and addtime BETWEEN '" + yesterdayStart +"' and '"+yesterdayEnd + "'";
 
orderSucessCountSql = "select count(1) FROM tb_crmorders WHERE type =2 and action =1 and result = 'true' and notifyresult = 0 and addtime BETWEEN '" + yesterdayStart +"' and '"+yesterdayEnd + "'";
orderErrorCountSql = "select count(1) FROM tb_crmorders WHERE type =2 and action =1 and result = 'true' and notifyresult IS NOT NULL and notifyresult != 0 and addtime BETWEEN '" + yesterdayStart +"' and '"+yesterdayEnd + "'";
unsubscribeSucessCountSql = "select count(1) FROM tb_crmorders WHERE type =2 and action =2 and result = 'true' and notifyresult = 0 and addtime BETWEEN '" + yesterdayStart +"' and '"+yesterdayEnd + "'";
unsubscribeErrorCountSql = "select count(1) FROM tb_crmorders WHERE type =2 and action =2 and result = 'true' and notifyresult IS NOT NULL and notifyresult != 0 and addtime BETWEEN '" + yesterdayStart +"' and '"+yesterdayEnd + "'";
 
orderKadanSql = "select count(1) FROM tb_crmorders WHERE type =2 and action =1 and result = 'true' and notifyresult IS NULL and addtime BETWEEN '" + yesterdayStart +"' and '"+yesterdayEnd + "'";
unsubscribeKadanSql = "select count(1) FROM tb_crmorders WHERE type =2 and action =2 and result = 'true' and notifyresult IS NULL and addtime BETWEEN '" + yesterdayStart +"' and '"+yesterdayEnd + "'";
preCherkKeyList =['CRM预校验成功单子数量:','CRM预校验成功账号数量:','CRM预校验失败单子数量:','CRM预校验失败账号数量:','订购的订单数 成功:','订购的订单数 失败:','订购卡单数:','退订的订单数 成功:','退订的订单数 失败:','退订卡单数:']
preCherkL = {'CRM预校验成功单子数量:' :preCheckCountSuccesSql ,'CRM预校验成功账号数量:' :preCheckUseridSuccesSql ,'CRM预校验失败单子数量:' :preCheckCountErrorSql ,'CRM预校验失败账号数量:' :preCheckUseridErrorSql}
preCherkL['订购的订单数 成功:'] = orderSucessCountSql
preCherkL['订购的订单数 失败:'] = orderErrorCountSql
preCherkL['订购卡单数:'] = orderKadanSql
preCherkL['退订的订单数 成功:'] = unsubscribeSucessCountSql
preCherkL['退订的订单数 失败:'] = unsubscribeErrorCountSql
preCherkL['退订卡单数:'] = unsubscribeKadanSql
 
mailMessageText =''
 
for key in preCherkKeyList:
  reslist = ms.ExecQuery(preCherkL[key])
  for i in reslist:
    for n in i:
      mailMessageText = mailMessageText + key + bytes(n) + '\n' 
 
 
crmOrderHandleTimeSql = "select addtime , notifytime FROM tb_crmorders WHERE type =2 and action =1 and result = 'true' and notifyresult =0 and addtime BETWEEN '" + yesterdayStart +"' and '"+yesterdayEnd + "'";
crmunsubscribeHandleTimeSql = "select addtime , notifytime FROM tb_crmorders WHERE type =2 and action =2 and result = 'true' and notifyresult =0 and addtime BETWEEN '" + yesterdayStart +"' and '"+yesterdayEnd + "'";
 
crmOrderHandle = ms.ExecQuery(crmOrderHandleTimeSql)
orderCount = len(crmOrderHandle)
if orderCount != 0:
  totleTime = 0
  for temp in crmOrderHandle:
    addtime = temp[0]
    notifytime = temp[1]
    
#     adddate = datetime.datetime.strptime(addtime,"%Y-%m-%d %H:%M:%S")
#     notifydate =datetime.datetime.strptime(notifytime, "%Y-%m-%d %H:%M:%S")
    chazhi = (notifytime - addtime).seconds / 60
    totleTime = float(totleTime) + float(chazhi)
  mailMessageText = mailMessageText + '订购平均处理时长:' + bytes(float(totleTime)/orderCount) + '分' + '\n' 
 
crmunsubscribeHandle = ms.ExecQuery(crmunsubscribeHandleTimeSql)
subscribeCount = len(crmunsubscribeHandle)
if subscribeCount != 0:
  subscribetotleTime = 0
  for temp in crmunsubscribeHandle:
    addtime = temp[0]
    notifytime = temp[1]
#     adddate = datetime.datetime.strptime(addtime, "%Y-%m-%d %H:%M:%S")
#     notifydate = datetime.datetime.strptime(notifytime, "%Y-%m-%d %H:%M:%S")
    chazhi = (notifytime - addtime).seconds / 60
    subscribetotleTime = float(subscribetotleTime) + float(chazhi)
  mailMessageText = mailMessageText + '退订平均处理时长:' + bytes(float(subscribetotleTime)/subscribeCount) + '分' + '\n' 
mailMessageText = mailMessageText + '附件为 :预校验失败订单,订购/退订失败订单,卡单订单' + '\n' 
 
print mailMessageText
 
#生成excel文件
 
preCheckErrorname = 'preCheckError'
preCerroeFile = ms.write_data_to_excel(preCheckErrorname, "select ordercode,userid,productid,action,msg FROM tb_crmorders WHERE type =1 and result = 'false' and addtime BETWEEN '" + yesterdayStart +"' and '"+yesterdayEnd + "'")
 
orderErrorname = 'orderFalse'
ordererroeFile = ms.write_data_to_excel(orderErrorname, "select ordercode,userid,productid,action,sg,notifyresult,notifymsg FROM tb_crmorders WHERE type =2  and result = 'true' and notifyresult IS NOT NULL and notifyresult != 0 and addtime BETWEEN '" + yesterdayStart +"' and '"+yesterdayEnd + "'")
 
kadanname = 'noSynchMsg'
kadanFile = ms.write_data_to_excel(kadanname, "select ordercode,userid,productid,sg,action FROM tb_crmorders WHERE type =2 and result = 'true' and notifyresult IS NULL and addtime BETWEEN '" + yesterdayStart +"' and '"+yesterdayEnd + "'")
# 第三方 SMTP 服务
mail_host="###@163.com" #设置服务器
mail_user=##"  #用户名
mail_pass="##"  #口令 
 
 
sender = '###@163.com'
receivers = ['##@qq.com'] # 接收邮件,可设置为你的QQ邮箱或者其他邮箱
 
#创建一个带附件的实例
message = MIMEMultipart()
 
message['From'] = Header("测试", 'utf-8')
message['To'] = Header(" , ".join(receivers), 'utf-8')
 
subject = 'CRM订单日数据' + yesterday.strftime('%Y-%m-%d')
message['Subject'] = Header(subject, 'utf-8')
 
#邮件正文内容
message.attach(MIMEText(mailMessageText, 'plain', 'utf-8'))
#设置邮件名片(html格式)
# html = file('qianming.html').read().decode("utf-8")
# message.attach(MIMEText(html, 'html', 'utf-8'))
 
# 构造附件1,传送当前目录下的preCerroeFile 文件
att1 = MIMEText(open(preCerroeFile, 'rb').read(), 'base64', 'utf-8')
att1["Content-Type"] = 'application/octet-stream'
# 这里的filename可以任意写,写什么名字,邮件中显示什么名字
att1["Content-Disposition"] = 'attachment; filename=' + preCerroeFile
message.attach(att1)
 
 
att2 = MIMEText(open(ordererroeFile, 'rb').read(), 'base64', 'utf-8')
att2["Content-Type"] = 'application/octet-stream'
att2["Content-Disposition"] = 'attachment; filename='+ordererroeFile
message.attach(att2)
 
 
att3 = MIMEText(open(kadanFile, 'rb').read(), 'base64', 'utf-8')
att3["Content-Type"] = 'application/octet-stream'
att3["Content-Disposition"] = 'attachment; filename='+kadanFile
message.attach(att3)
 
try:
  smtpObj = smtplib.SMTP() 
  smtpObj.connect(mail_host, 25)  # 25 为 SMTP 端口号
  smtpObj.login(mail_user,mail_pass) 
  smtpObj.sendmail(sender, receivers, message.as_string())
  print "邮件发送成功"
except smtplib.SMTPException,e:
  print "Error: 无法发送邮件" + repr(e)

以上这篇python生成每日报表数据(Excel)并邮件发送的实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python二分查找详解
Sep 13 Python
Python的Tornado框架实现图片上传及图片大小修改功能
Jun 30 Python
python执行使用shell命令方法分享
Nov 08 Python
Python + selenium自动化环境搭建的完整步骤
May 19 Python
numpy中矩阵合并的实例
Jun 15 Python
使用pandas read_table读取csv文件的方法
Jul 04 Python
python中单例常用的几种实现方法总结
Oct 13 Python
用Python逐行分析文件方法
Jan 28 Python
DjangoWeb使用Datatable进行后端分页的实现
May 18 Python
python pymysql库的常用操作
Oct 16 Python
django中ImageField的使用详解
Dec 21 Python
python 检测nginx服务邮件报警的脚本
Dec 31 Python
Python告诉你木马程序的键盘记录原理
Feb 02 #Python
Python实现DDos攻击实例详解
Feb 02 #Python
Python实现SQL注入检测插件实例代码
Feb 02 #Python
Django uwsgi Nginx 的生产环境部署详解
Feb 02 #Python
python实现一个简单的udp通信的示例代码
Feb 01 #Python
Python读取指定日期邮件的实例
Feb 01 #Python
Python 利用切片从列表中取出一部分使用的方法
Feb 01 #Python
You might like
PHP中获取内网用户MAC地址(WINDOWS/linux)的实现代码
2011/08/11 PHP
laravel框架select2多选插件初始化默认选中项操作示例
2020/02/18 PHP
javascript与CSS复习(三)
2010/06/29 Javascript
JavaScript动态加载样式表的方法
2015/03/21 Javascript
简述AngularJS的控制器的使用
2015/06/16 Javascript
jQuery实现淡入淡出二级下拉导航菜单的方法
2015/08/28 Javascript
KnockoutJS 3.X API 第四章之click绑定
2016/10/10 Javascript
js实现拖拽上传图片功能
2017/08/01 Javascript
Vue导出json数据到Excel电子表格的示例
2017/12/04 Javascript
Angular动态绑定样式及改变UI框架样式的方法小结
2018/09/03 Javascript
koa2 从入门到精通(小结)
2019/07/23 Javascript
一文看懂如何简单实现节流函数和防抖函数
2019/09/05 Javascript
详解阿里Node.js技术文档之process模块学习指南
2021/01/04 Javascript
python设置windows桌面壁纸的实现代码
2013/01/28 Python
python实现网页链接提取的方法分享
2014/02/25 Python
使用pycharm生成代码模板的实例
2018/05/23 Python
Pycharm新建模板默认添加个人信息的实例
2019/07/15 Python
利用python-docx模块写批量生日邀请函
2019/08/26 Python
pytorch中的自定义反向传播,求导实例
2020/01/06 Python
Python如何使用turtle库绘制图形
2020/02/26 Python
解决python 在for循环并且pop数组的时候会跳过某些元素的问题
2020/12/11 Python
python Protobuf定义消息类型知识点讲解
2021/03/02 Python
CSS3 中的@keyframes介绍
2014/09/02 HTML / CSS
土木工程应届生求职信
2013/10/31 职场文书
质检部岗位职责
2013/11/11 职场文书
优秀学生获奖感言
2014/02/15 职场文书
保密普查工作实施方案
2014/02/25 职场文书
建议书标准格式
2014/03/12 职场文书
居委会四风问题个人对照检查材料
2014/09/25 职场文书
2014红色之旅心得体会
2014/10/07 职场文书
未婚证明书模板
2014/10/08 职场文书
2015年秋季运动会广播稿
2015/08/19 职场文书
职场干货:简历中的自我评价应该这样写!
2019/05/06 职场文书
vue中三级导航的菜单权限控制
2021/03/31 Vue.js
关于Spring配置文件加载方式变化引发的异常详解
2022/01/18 Java/Android
win10蓝屏0xc0000001安全模式进不了怎么办?win10出现0xc0000001的解决方法
2022/08/05 数码科技