准备工作
1.在代码文件同级目录下建好excel 如xxx报表
2.报表里面建好代码里面要用的相应的sheet,sheet空不空都无所谓,如daoqi
3.再建好要展示的sheet,并做好相应的变量映射 ,如=daoqi!a2,最后调整好格式,如展示数据需要百分比方式显示,单元格颜色等
下面贴代码
#导库 ,没有的自行安装
import pandas as pd
import numpy as np
import pymysql
import time
from datetime import datetime, timedelta
import json
import pymongo
import pymysql
import pandas as pd
import numpy as np
from sshtunnel import SSHTunnelForwarder
import openpyxl
import os
import smtplib
import xlrd
import email
import email.mime.text
import email.mime.multipart
from email.mime.text import MIMEText
from email.mime.application import MIMEApplication
import collections
from collections import OrderedDict
import warnings
warnings.filterwarnings("ignore")
#假设得到一个daoqi的DataFrame
sql="""
"""
daoqi==pd.read_sql_query(sql,conn)
#定义写入函数
def write_to_sheet(wb,sheet_name,df):
ws=wb[sheet_name]
columns=list(df.columns)
for col in range(len(columns)):
ws.cell(1,col+1,columns[col])
m, n = df.shape
values = df.values
for row in range(m):
for col in range(n):
value = values[row, col]
ws.cell(row+2, col+1, value)
return wb
#打开xxx报表
today = datetime.today().strftime('%Y%m%d')
wb = openpyxl.load_workbook('xxx报表.xlsx')
#写入sheet
write_to_sheet(wb,'daoqi',daoqi)
#以今天为例生成名为:'xxx报表20210729'
wb.save('xxx报表%s.xlsx'%today)
def CutHour(time):
"""截取时分秒"""
new_time = str(time)
hour = new_time[11:19]
return "".join(hour)
#%%
def start_send_mail():
today = datetime.today().strftime('%Y%m%d')
print("开始处理数据")
#导入报表代码
#读取数据
#配置邮件
msg = email.mime.multipart.MIMEMultipart()
#这里的协议以自己用的邮箱为准
smtp = smtplib.SMTP_SSL('smtp.exmail.qq.com',465)
msg['from'] = 'xxx.com' #发件人邮箱
msg['subject'] = 'xxx报表%s'%(today) #主题名称
#2.4邮件附件
path_list=['xxx报表%s.xlsx'%(today)]
for File_path in path_list:
xlsxpart = MIMEApplication(open(File_path, 'rb').read())
# filename表示邮件中显示的附件名
xlsxpart.add_header('Content-Disposition','attachment',filename = '%s'%(File_path.split('/')[-1]))
msg.attach(xlsxpart)
#3.发件人
smtp.login('xxx.com','授权码')
smtp.sendmail('xxx.com',['xxx.com'],msg.as_string())#发件人,收件人
smtp.sendmail('xxx.com',['2477627527@qq.com', 'xxx.com'],msg.as_string())#发件人,收件人
smtp.quit()
time.sleep(2)
print("发送完成")
start_send_mail()
#这里的收件人可以写多人列表,不过一般都是发给自己的邮箱,再从自己邮箱获取报表后再将要展示的部分进行截图并附件转发
#截图功能实现较为复杂以后有空再写文章