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