zoukankan      html  css  js  c++  java
  • 通过Python实现生成excel并邮件发送的功能

    1.需求描述

    因业务方需求,在一个月内,需要每天从数据库中收集、汇聚相关数据,形成3份excel,然后发给相关人。工作虽然简单,但是还是需要花费大家的时间和经历,所以,通过一份简单的python代码来实现此功能。

     2.执行文件

    3.代码实现

    Python 的运行环境:Python 2.7.5

    3.1 邮件配置文件

    邮件配置文件smtp_conig.py,可参阅  https://www.cnblogs.com/xuliuzai/p/14156559.html 的发送邮件的模块smtp_config.py,在此不再赘述。

    3.2 数据库配置文件

    数据库配置文件为db_weixindb_conn.py和db_qqdb_conn.py,因为是连接不同实例上的两个数据库,所以,我们将配置信息放在了两个文件中。其具体的配置可参照

    https://www.cnblogs.com/xuliuzai/p/14721413.html 中的《db_conn.py》文件。

    3.3 功能代码

    主要执行文件report_excel_mail_.py的代码如下 

    #!/usr/bin/python
    # -*- coding: UTF-8 -*-
    
    import sys
    reload(sys)
    sys.setdefaultencoding( "utf-8" )
    import db_weixindb_conn
    import db_qqdb_conn
    import os
    import time
    import smtp_config
    from email.mime.text import MIMEText
    from email.header import Header
    from email.mime.image import MIMEImage
    from email.mime.multipart import MIMEMultipart
    from email.mime.application import MIMEApplication
    ##引入生成excel库
    import string
    import xlsxwriter
    import datetime
    
    def send_mail(mail_msg):
        # 调用send_mail函数
        mail_body = """
        <style type="text/css">
        </style>
        <html><font color=#0000CC>Dear All,<br><br>&nbsp;&nbsp;&nbsp;本邮件为QQ Order 维护部分测试邮件。主要用来测试生成excel,并且以邮件的形式发送的功能,请互理。</html>
         """
        mail_body = mail_body + mail_msg
        message = MIMEText(mail_body, 'html', 'utf-8')
        msg = MIMEMultipart()
        msg.attach(message)
        msg.attach(xlsxpart_publish)
        msg.attach(xlsxpart)
        msg.attach(xlsxpart_slow)
    
        subject = 'BBChat日报'
        msg['Subject'] = Header(subject, 'utf-8')
        smtp_config.send_mail(msg)
        return
    
    ###查询的时间范围
    ### TypeError: strptime() argument 0 must be str, not <class 'datetime.datetime'>
    e_time = (datetime.datetime.now() + datetime.timedelta(-1)).strftime('%Y-%m-%d')
    s_time = (datetime.datetime.now() + datetime.timedelta(-8)).strftime('%Y-%m-%d')
    
    # 定义时间标志变量
    sheet_time = datetime.datetime.now()
    sheet_mark = sheet_time.strftime('%Y-%m-%d')
    book_mark = sheet_time.strftime('%Y%m%d')
    
    # 定义输出excel文件名
    workbook_publish = xlsxwriter.Workbook('BBChat_App_publish_'+book_mark+'.xlsx')
    # 定义sheet的名字
    worksheet_publish = workbook_publish.add_worksheet(sheet_mark)
    # 定义sheet中title的字体format
    bold_publish = workbook_publish.add_format({'bold': True})
    
    # 定义输出excel文件名
    workbook_slow = xlsxwriter.Workbook('BBChat_App_slow_'+book_mark+'.xlsx')
    # 定义sheet的名字
    worksheet_slow = workbook_slow.add_worksheet(sheet_mark)
    # 定义sheet中title的字体format
    bold_slow = workbook_slow.add_format({'bold': True})
    
    # 定义输出excel文件名
    workbook = xlsxwriter.Workbook('BBChat_App_'+book_mark+'.xlsx')
    # 定义sheet的名字
    worksheet = workbook.add_worksheet(sheet_mark)
    # 定义sheet中title的字体format
    bold = workbook.add_format({'bold': True})
    
    #定义邮件体变量
    mail_msg = ""
    
    # 获取数据库连接
    db = db_weixindb_conn.db
    db_qqdb = db_qqdb_conn.db
    # 使用cursor()方法获取操作游标
    cursor = db_qqdb.cursor()
    # SQL 查询语句
    # 备份日报
    sql_apppublish_report = " select q_id,q_title,q_app_id,q_status,q_r_type,q_creator,q_create_time from qq_release " 
                         " where q_create_time>= %s and q_create_time< %s  " 
                         " and status != 0; "
    try:
        # 执行SQL语句
        cursor.execute(sql_apppublish_report,(s_time,e_time))
        # 获取所有记录列表
        results = cursor.fetchall()
        # 查询数据结果和字段名字 赋值给两个变量
        ##result = cur.fetchall() ##前面已经赋值
        fields = cursor.description # get column name
    
        ## 将结果写入excel中
        ## 定义title的坐标:row=0,col=0~字段总数 也就是excel的第一行:0,0  ~ 0,len(fields),通过fields[field][0] 获取字段名
        for field in range(0,len(fields)):
          worksheet_publish.write(0,field,fields[field][0],bold_publish)
    
        for row in range(1,len(results)+1):
          for col in range(0,len(fields)):
            worksheet_publish.write(row,col,u'%s' % results[row-1][col])
    
        workbook_publish.close()
    
        ##添加邮件附件,xlsx类型的附件
        xlsxFile_publish = '/data/scripts/' + 'BBChat_App_publish_'+book_mark+'.xlsx'
        xlsxpart_publish = MIMEApplication(open(xlsxFile_publish, 'rb').read())
        xlsxpart_publish.add_header('Content-Disposition', 'attachment', filename=xlsxFile_publish)
        ##attachfile = xlsxpart
        ##发送邮件
        #send_mail(mail_msg)
    
    except  Exception as e:
        print str(Exception)
        print str(e)
    # 关闭游标
    cursor.close()
    # 关闭数据库连接
    db_qqdb.close()
    
    ####调用存储生成数据
    # 使用cursor()方法获取操作游标
    cursor = db.cursor()
    try:
        cursor.execute('CALL usp_collect_appBBChat()')
    except  Exception as e:
        print str(Exception)
        print str(e)
    db.commit ###因为默认的autocommit = false,SP中有增、删、改,必须显示commit,才能提交落库。 cursor.close()
    ####数据生成 #### 生成第二个文件 # 使用cursor()方法获取操作游标 cursor = db.cursor() # SQL 查询语句 # 备份日报 sql_app_report = " select t1.topic,t1.cnt_1,t2.cnt_2 from " " ( select topic,count(*) as cnt_1 from qqapp_alertlog_2 group by topic ) t1 " " join " " ( select topic,count(*) as cnt_2 from ( select distinct topic,api_id from qqapp_alertlog_2 ) t group by topic ) t2 on t1.topic = t2.topic " " order by cnt_1 desc; " try: # 执行SQL语句 cursor.execute(sql_app_report) # 获取所有记录列表 results = cursor.fetchall() # 查询数据结果和字段名字 赋值给两个变量 ##result = cur.fetchall() ##前面已经赋值 fields = cursor.description # get column name ## 将结果写入excel中 ## 定义title的坐标:row=0,col=0~字段总数 也就是excel的第一行:0,0 ~ 0,len(fields),通过fields[field][0] 获取字段名 for field in range(0,len(fields)): worksheet.write(0,field,fields[field][0],bold) for row in range(1,len(results)+1): for col in range(0,len(fields)): worksheet.write(row,col,u'%s' % results[row-1][col]) workbook.close() ##添加邮件附件,xlsx类型的附件 xlsxFile = '/data/scripts/' + 'BBChat_App_'+book_mark+'.xlsx' xlsxpart = MIMEApplication(open(xlsxFile, 'rb').read()) xlsxpart.add_header('Content-Disposition', 'attachment', filename=xlsxFile) ##### 生成第二个文件 End ### ##send_mail(mail_msg) except Exception as e: print str(Exception) print str(e) # 关闭游标 cursor.close() # 关闭数据库连接 #db.close() #### 生成第三个文件 # 使用cursor()方法获取操作游标 cursor = db.cursor() # SQL 查询语句 # 备份日报 sql_app_slow = " select id, core_api, post_time,topic,app_id, api_id,method,cnt, taken_avg,fail_cnt,fail_per " " from qqapp_alertlog_2 " try: # 执行SQL语句 cursor.execute(sql_app_slow) # 获取所有记录列表 results = cursor.fetchall() # 查询数据结果和字段名字 赋值给两个变量 ##result = cur.fetchall() ##前面已经赋值 fields = cursor.description # get column name ## 将结果写入excel中 ## 定义title的坐标:row=0,col=0~字段总数 也就是excel的第一行:0,0 ~ 0,len(fields),通过fields[field][0] 获取字段名 for field in range(0,len(fields)): worksheet_slow.write(0,field,fields[field][0],bold_slow) for row in range(1,len(results)+1): for col in range(0,len(fields)): worksheet_slow.write(row,col,u'%s' % results[row-1][col]) workbook_slow.close() ##添加邮件附件,xlsx类型的附件 xlsxFile_slow = '/data/scripts/' + 'BBChat_App_slow_'+book_mark+'.xlsx' xlsxpart_slow = MIMEApplication(open(xlsxFile_slow, 'rb').read()) xlsxpart_slow.add_header('Content-Disposition', 'attachment', filename=xlsxFile_slow) ##### 生成第二个文件 End ### send_mail(mail_msg) except Exception as e: print str(Exception) print str(e) # 关闭游标 cursor.close() # 关闭数据库连接 db.close()

     4.功能实现

    经过测试验证,满足生产要求。

  • 相关阅读:
    深度学习文献代码阅读-超分辨(ESRGAN)
    缺陷检测-5.Learning to Detect Multiple Photographic Defects(学习去检测多种摄像缺陷)
    缺陷检测-4.Semi-supervised Anomaly Detection using AutoEncoders(半监督缺陷检测使用自动的编码器)
    缺陷检测-3.CutPaste: Self-Supervised Learning for Anomaly Detection and Localization(剪切粘贴:自监督学习对于异常检测和定位)
    缺陷检测-2.Mixed supervision for surface-defect detection: from weakly to fully supervised learning(对于表面缺陷检测的混合监督:从弱到完全监督学习)
    缺陷检测-1.End-to-end training of a two-stage neural network for defect detection(端到端的两步神经网络的缺陷检测)(论文和代码讲解)
    Mac Docker 中运行 Linux 0.12
    Sharding-JDBC 学习
    编译型语言&解释型语言
    vnc客户端远程登录无显示器Apple macOS 主机修改分辨率的方法
  • 原文地址:https://www.cnblogs.com/xuliuzai/p/15138837.html
Copyright © 2011-2022 走看看