侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

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

Python  /  管理员 发布于 7年前   156

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

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

#coding:utf-8from __future__ import divisionimport pymssql,sys,datetime,xlwt import smtplibfrom email.mime.text import MIMETextfrom email.mime.multipart import MIMEMultipartfrom 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 yesterdayStartpreCheckCountSuccesSql = "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['订购的订单数 成功:'] = orderSucessCountSqlpreCherkL['订购的订单数 失败:'] = orderErrorCountSqlpreCherkL['订购卡单数:'] = orderKadanSqlpreCherkL['退订的订单数 成功:'] = unsubscribeSucessCountSqlpreCherkL['退订的订单数 失败:'] = unsubscribeErrorCountSqlpreCherkL['退订卡单数:'] = 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=' + preCerroeFilemessage.attach(att1)  att2 = MIMEText(open(ordererroeFile, 'rb').read(), 'base64', 'utf-8')att2["Content-Type"] = 'application/octet-stream'att2["Content-Disposition"] = 'attachment; filename='+ordererroeFilemessage.attach(att2)  att3 = MIMEText(open(kadanFile, 'rb').read(), 'base64', 'utf-8')att3["Content-Type"] = 'application/octet-stream'att3["Content-Disposition"] = 'attachment; filename='+kadanFilemessage.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告诉你木马程序的键盘记录原理
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • 在python语言中Flask框架的学习及简单功能示例(0个评论)
    • 在Python语言中实现GUI全屏倒计时代码示例(0个评论)
    • Python + zipfile库实现zip文件解压自动化脚本示例(0个评论)
    • python爬虫BeautifulSoup快速抓取网站图片(1个评论)
    • vscode 配置 python3开发环境的方法(0个评论)
    • 近期文章
    • 智能合约Solidity学习CryptoZombie第二课:让你的僵尸猎食(0个评论)
    • 智能合约Solidity学习CryptoZombie第一课:生成一只你的僵尸(0个评论)
    • 在go中实现一个常用的先进先出的缓存淘汰算法示例代码(0个评论)
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf文件功能(0个评论)
    • Laravel从Accel获得5700万美元A轮融资(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2016-11
    • 2018-04
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2022-01
    • 2023-07
    • 2023-10
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客