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

从数仓取数加工处理后放在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 = '''
            

Dear all:

   以下是******报表,请查收。

1.*********** :

2.*********** :

''' 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', '') 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并发送可视化邮件)