美文网首页
【python】自动生成excel并发送可视化邮件

【python】自动生成excel并发送可视化邮件

作者: MichalLiu | 来源:发表于2019-11-01 14:16 被阅读0次

    从数仓取数加工处理后放在excel,进一步处理后分析数据,生成可视化图片,形成报告发送邮件等内容,以下的python脚本,自动化处理上面的整个流程。

    PART 1 数仓取数到EXCEL

    ###############################################################################
    ## ********************************   生成excel    **************************##
    ###############################################################################
    import pandas as pd
    from sqlalchemy.engine import create_engine
    import xlsxwriter
    import time
    
    ## ***************************    向excel添加数据表1     *******************##
    # 准备语句(不能带分号)
    sql_1 = """
                select 
                    *
                from  t
                order by data_date asc
            """
            
    presto_engine = create_engine('jdbc://110.120.119.115:8866/hive') 
    
    # 从数据库获取数据
    df_1 = pd.read_sql(sql_1, presto_engine)
    headline_1 = df_1.columns.values.tolist()         #tb1获取列名
    
    ## 生成excel文件
    # 需要修改(导出的文件路径)
    out_path = r'C:\Users\Dell\Desktop\Day_Report'+  '(' + time.strftime("%Y-%m-%d") +')' + '.xlsx'  
    workbook = xlsxwriter.Workbook(out_path , {'strings_to_numbers': True})       # workbook是sheet赖以生存的载体。
    
    # 定义sheet的名字
    sheet1 = workbook.add_worksheet('01sheet')
    
    # 定义表格样式
    format1 = workbook.add_format({'align': 'center', 'bg_color': '#83ABED', 'bold': 'true', 'border': 1})
    format2 = workbook.add_format({'border': 1}) 
    format3 = workbook.add_format({ 'border': 1 , 'num_format': '##.##%'})
    
    #在excel文件中写入表格数据
    def report1():
        sheet1.set_column(0, df_1.shape[1], 12)                    # 设置表头列宽为12
    
        #写入数据表格表头
        #sheet1.merge_range('A1:D1','信息',format1)      # 合并单元格写入表头
        sheet1.write_row('A1',headline_1,format1)           # 写入字段列名
    
        #写入表格数据
        for rows in range(1,len(df_1)+1):
            for cols in range(0,df_1.shape[1]):
                if cols in range(0,4) :
                    sheet1.write(rows, cols, df_1.iloc[rows-1,cols],format2)          
                else:
                    sheet1.write(rows, cols, df_1.iloc[rows-1,cols],format3)  # 百分比形式显示
    
    ####################   加入图形1   ######################
    # 图表类型 柱形图
    chart1 = workbook.add_chart({'type': 'column'})
    # 图形大小
    chart1.height = 500
    chart1.width  = 900
    # 横轴种类和数值
    chart1.add_series({'name':        'APPLY人数', 
                       'categories': ['01sheet',1,0,7,0], 
                       'values':     '=01sheet!$B$2:$B$8',
                       'data_labels': {'value': True}
                       })
    chart1.add_series({'name':        'CROSS人数',
                       'categories': ['01sheet',1,0,7,0], 
                       'values':     '=01sheet!$C$2:$C$8',
                       'data_labels': {'value': True}
                       })
    chart1.add_series({'name':        'SUCC人数',
                       'categories': ['01sheet',1,0,7,0], 
                       'values':     '=01sheet!$D$2:$D$8',
                       'data_labels': {'value': True}
                       })
    # 图形名称
    chart1.set_title({'name': 'APPLY-CROSS人数'})
    # 类别所在位置
    chart1.set_legend({'position': 'bottom'})
    # 图形插入位置
    sheet1.insert_chart('G1', chart1)
    
    if __name__=="__main__":
        report1()  
        workbook.close()
    
    print('-----------------success!------------------')
    

    PART 2 从EXCEL截图并保存在本地

    ###############################################################################
    ## ********************************   excel截图     *************************##
    ###############################################################################
    import win32com.client as win32   # 打开excel文件
    from PIL import ImageGrab         #用于获取复制的图片
    import pythoncom
    import time
    
    pythoncom.CoInitialize()        # excel多线程相关
    root_path = "C:\\Users\\Dell\\Desktop\\"
    
    #获取Excel
    excel = win32.Dispatch('Excel.Application')
    excel.Visible = True
    #excel.DisplayAlerts = False
    # 打开excel文件
    wb = excel.Workbooks.Open(r'C:\Users\Dell\Desktop\Day_Report'+'('+time.strftime("%Y-%m-%d") +')'+ '.xlsx') 
    
    ################ 制作图1 ################
    ws_1 = wb.Worksheets('01sheet')        # 获取Sheet
    # 复制图片区域
    ws_1.Range('G1:T25').CopyPicture()
    ws_1.Paste(ws_1.Range('V1'))            # 将图片移动到
    # 定义图片名称
    #excel.Selection.ShapeRange.Name = 'pic_1'     # 选择区域重命名
    ws_1.Shapes('Picture 1').Copy()
    img_1 = ImageGrab.grabclipboard()
    # 图片另存为本地
    img_1.save(root_path + 'regist-cross' +'.jpg')
    
    wb.Close(SaveChanges=0)       #关闭sheet,不保存
    excel.Quit()                  #关闭excel
    pythoncom.CoUninitialize()    #关闭多线程
    
    print('--------------------success----------------------')
    
    

    PART 3 发送邮件

    ###############################################################################
    ## *******************************   发送邮件     ****************************##
    ###############################################################################
    
    from email.mime.text import MIMEText
    from email.mime.image import MIMEImage
    from email.mime.base import MIMEBase
    from email.mime.multipart import MIMEMultipart
    from email import encoders
    import smtplib
    import time
    
    def send_mail():
        email_host = 'smtp.exmail.qq.com'      # 服务器地址   qq邮箱"smtp.qq.com"都需要开通smtp权限
        sender     = ''      # 发件人(自己的邮箱)
        password   = ''      # 密码(自己邮箱的登录密码)
        receiver   = ''      # 收件人   
    
        msg = MIMEMultipart()
        msg['Subject'] = ''      # 标题
        msg['From'] = ''         # 邮件中显示的发件人别称
        msg['To'] = ''           # 收件人别称
    
        # 邮件正文内容,可以插入图片
        mail_msg = '''
                <p> Dear all: </p>
                <p> &emsp;&emsp; 以下是******报表,请查收。</p>
                <p>1.*********** :</p>
                <p><img src="cid:image1"></p>
                <p>2.*********** :</p>
                <p><img src="cid:image2"></p>
                '''
    
        msg.attach(MIMEText(mail_msg, 'html', 'utf-8'))
        # 指定图片为当前目录
        fp_1 = open(r'C:\Users\Dell\Desktop\regist-cross.jpg', 'rb')
        msgImage_1 = MIMEImage(fp_1.read())
        fp_1.close()
        # 定义图片 ID,在 HTML 文本中引用
        msgImage_1.add_header('Content-ID', '<image1>')
        msg.attach(msgImage_1)
    
        # 附件参数
        ctype = 'application/octet-stream'
        maintype, subtype = ctype.split('/', 1)
    
        # 附件-图片
    #    image = MIMEImage(open(r'C:\Users\Dell\Desktop\regist-cross.jpg', 'rb').read(), _subtype=subtype)
    #    image.add_header('Content-Disposition', 'attachment', filename='img.jpg')
    #    msg.attach(image)
        
        # 附件-文件
        file = MIMEBase(maintype, subtype)
        file.set_payload(open(r'C:\Users\Dell\Desktop\Day_Report'+'('+time.strftime("%Y-%m-%d") +')'+'.xlsx','rb').read())
        file.add_header('Content-Disposition','attachment',filename='Day_Report'+'_'+time.strftime("%Y-%m-%d")+'.xlsx')
        encoders.encode_base64(file)
        msg.attach(file)
    
         # 发送
        smtp = smtplib.SMTP_SSL(host = 'smtp.exmail.qq.com')
        smtp.connect(email_host, 465)
        smtp.login(sender, password)
        smtp.sendmail(sender, receiver, msg.as_string())
        smtp.quit()
    
    send_mail()
    print('----------------success-------------')
    
    

    PART 4 定时调度任务

    import schedule
    import time
     
    def job():
        import os
        os.system("python ./1_view_python.py")
        os.system("python ./2_picture.py")
        os.system("python ./3_sent_email.py")
    
        print('----------------success------------------')
     
    schedule.every().day.at("13:43").do(job)
    
    # 查询死循环,每隔10秒查询
    while True:
        schedule.run_pending()
        time.sleep(10)
    
    

    结束

    相关文章

      网友评论

          本文标题:【python】自动生成excel并发送可视化邮件

          本文链接:https://www.haomeiwen.com/subject/govfbctx.html