需求:编写一个Python程序每天定时给业务人员发送报表。

实现思路:要定期发送报表需要Python连接MySQL获取数据库每日更新的数据;然后把数据按照指定格式写入到Excel表格内,若有需求还可以在工作表内绘制图表;最后利用Python 的邮件发送模块把报表作为附件发送给收件人。

一、代码操作前的基本配置

在使用自定义程序发送邮件时需要先开通POP3/SMTP服务和IMAP/SMTP服务。以QQ邮箱为例,操作如下。

注意,在代码里登录邮箱时用的不是我们邮箱账号的密码,而是在开通服务时得到的授权码,因此这里可以把它复制下。生成授权码时需要手机短信进行验证。授权码有效期是有限的,在失效或忘记后可再一次的申请

在登录邮箱时除了需要授权码,还需要SMTP服务器地址,QQ邮箱的SMTP服务器地址是smtp.qq.com。这个不用查询,每个人QQ邮箱都用的是这个。163邮箱用的是smtp.163.com。

在使用Python发送邮件时我将会使用yagmail模块,在使用Python连接MySQL数据库时我使用的是pymysql模块。因此,可以在命令行中使用pip install yagmail 和pip install pymysql命令进行安装。

二、基本测试

1.下面进行一个简单的测试,看能否成功给自己发送一个邮件


import  yagmail
import  time
user="77xxxx@qq.com"                          #发件人邮箱
password="jhcryppljuthbehh"                     #发件人的SMTP服务授权密码)
host="smtp.qq.com"                             #SMTP服务器地址
mail=yagmail.SMTP(user,password,host)
contents = ['今日报表已更新,请注意查收。','如有疑问请与我联系!']       #邮件内容
attachment = [r'D:\餐饮日报\hello.jpg']                       #附件
subject="这是一封使用yagmail模块测试的邮件"
receiver = ['77xxxx@qq.com','xxxxxxxxx@qq.com']   #收件人
mail.send(receiver,subject, contents)
mail.close()
print('当前时间:',time.strftime('%H:%M:%S',time.localtime(time.time())) ,"邮件发送成功")

运行完代码后效果如下,可以看到我已经成功给自己发送了一封邮件。

2.下面再进行一个Python连接Mysql测试

import pymysql
import pandas as pd
con=pymysql.connect(host="localhost",password="123456",port=3306,user="root",charset="utf8")
sql="select * from food_store.sale_datail"
df=pd.read_sql(sql,con)
df.head()

下面是代码运行结果,可以看到我已经成功地读取到了我的food_store数据库里的sale_datail表格了。

三、项目案例

下面我们就以MySQL里的sale_datail数据为例,来演示我是如何使用Python连接MySQL数据库实现每日定时批量发送报表邮件代码中加入了while和if循环,让代码可以不断运行,并在当前时间等于设定好的邮件发送时间时,执行连接数据库获取数据并进行邮件发送的命令。使用了xlsxwriter模块替代df.to_excel命令,可以在把数据写入表格时设置显示格式。使用了openpyxl模块可以在已有的Excel中插入一个图片。

#导入模块
import pymysql
import pandas as pd
import xlsxwriter
import time
import matplotlib.pyplot as plt
import yagmail
from openpyxl import Workbook
from openpyxl import load_workbook
from openpyxl.drawing.image import Image
from openpyxl.styles import Font#配置时间
send_hour=14
send_min=27
send_sec=0#配置收发件人信息
user = "xxxxx@qq.com"                          #发件人邮箱
password = "jhcrypplkuthbehh"                  #发件人的SMTP服务授权密码)
host = "smtp.qq.com"                           #发件人的SMTP服务器地址
mail = yagmail.SMTP(user,password,host)
subject = "餐饮日报"                              #邮件主题
receiver = ['xxxx@qq.com','xxx@qq.com']   #收件人邮箱while True:cur_time=time.localtime(time.time()) #当前时间current_time = time.strftime('%H:%M:%S',time.localtime(time.time()))    #时间格式标准化current_hour=cur_time.tm_hourcurrent_min=cur_time.tm_mincurrent_sec=cur_time.tm_secif((send_hour==current_hour) and (send_min==current_min) and (send_sec==current_sec)):sql_1="""select 日期,消费人数,销售额,sum(销售额) over(order by 日期) as 累计销售额from(select date_format(sale_date,'%m-%d')     as 日期, sum(people_number)  as 消费人数,sum(consumption)   as  销售额from food_store.sale_datailgroup by sale_date) as t;"""con=pymysql.connect(host="localhost",password="123456",port=3306,user="root",charset="utf8")df=pd.read_sql(sql_1,con)  #写入数据workbook = xlsxwriter.Workbook(r'D:\餐饮日报\销售日报.xlsx')  #创建工作簿worksheet = workbook.add_worksheet("sales")                   #创建工作表。此时还未写入数据,文件夹内还不会有销售日报excel文件format_data = workbook.add_format({"font_name": u"仿宋"})          #定义一个格式对象来设置单元格格式format_data.set_align('center')                                    #居中显示format_title = workbook.add_format() format_title.set_align('center')   #定义fromat_title对象的单元格居中format_title.set_bold()           #单元格文本内容加粗worksheet.set_column('D:D',15)    #设置D列的列宽title=[u'日期',u'消费人数',u'销售额',u'累计销售额']worksheet.write_row('A1',title,format_title)        #写入第1行for i in range(len(df)):worksheet.write(i+1,0,df['日期'][i],format_data)       #写入第1列所有行数据worksheet.write(i+1,1,df['消费人数'][i],format_data)  #写入第2列所有行数据worksheet.write(i+1,2,df['销售额'][i],format_data) worksheet.write(i+1,3,df['累计销售额'][i],format_data) workbook.close()#保存工作簿   # with pd.ExcelWriter(r'D:\餐饮日报\销售日报.xlsx',mode='w') as writer:  #         df.to_excel(writer, sheet_name='sales',index=False)  #也可以这样写入数据,但无法自定义格式 #绘制图片放入到本地plt.rcParams['font.sans-serif'] = ['Simhei'] plt.figure(figsize=(8,4),dpi=100)plt.title("销售额随时间的变化趋势",color='k',fontsize=13)plot_data=df.set_index("日期")plot_data['销售额'].sort_index().plot();plt.savefig(r'D:\餐饮日报\销售额变化趋势.png')#把图片放到工作表def insert_img(imgPath,excelPath):wb = load_workbook(excelPath)ws = wb.activeimg = Image(imgPath)  ws.add_image(img, 'E2')               # 图片插入E2的位置上wb.save('D:\餐饮日报\销售日报.xlsx')  # 结果保存输出if __name__ == '__main__':imgPath = 'D:\餐饮日报\销售额变化趋势.png'excelPath = 'D:\餐饮日报\销售日报.xlsx'insert_img(imgPath, excelPath)#发送邮件contents = ['您好,今日报表已更新,请注意查收','如有疑问,请随时与我联系!']       #邮件内容attachment = [r'D:\餐饮日报\销售日报.xlsx',r'D:\餐饮日报\hello.jpg']            #附件mail.send(receiver,subject,contents,attachment)mail.close()print(current_time,"邮件已发送")time.sleep(100)

欢迎关注微信公众号方知数据,一起提高数据分析技能和数据分析思维


Python办公自动化实践:连接MySQL数据库实现每日定时批量发送报表邮件相关推荐

  1. 记录python使用pymysql连接mysql数据库,使用impyla、ibis-framework[impala]连接hive\impala(kerberos)数据库(备以后查阅)

    记录python使用pymysql连接mysql数据库,使用impyla.ibis-framework[impala]连接hive\impala(kerberos)数据库(备以后查阅) 连接mysql ...

  2. pydev集成mysql_【Python】Windows平台下Python、Pydev连接Mysql数据库

    Mysql数据库是跨平台的,不是说Python一定就要连接Mongodb. Python连接Mysql数据库是非常easy的. 首先,你要配置好Python的开发环境,详见<[Python]Wi ...

  3. python数据分析之连接MySQL数据库并进行数据可视化

    大家好,我是带我去滑雪! 本期将熟悉MySQL数据库以及管理和操作MySQL数据库的数据库管理工具Navicat Premium,然后在python中调用MySQL数据库进行数据分析和数据可视化. 目 ...

  4. 【Python】PyMySQL 连接 MySQL数据库

    PyMySQL连接 Mysql 安装 PyMySQL PyMySQL 连接数据库 创建数据库(数据库必须存在) 创建数据表 插入操作 查询操作 更新操作 删除操作 综合案例 Connection Ob ...

  5. 用python和Java连接MySQL数据库,插入百万,千万条数据

    python代码: 需要用到 pymysql模块,python没有的话可以通过以下方式安装: 运行Anaconda Prompt pydemo是自己创建的python开发环境的名字 (C:\Progr ...

  6. Python利用pymysql连接Mysql数据库

    pymysql是一个Python的第三方包,需要手动安装后才能使用 1.使用pymysql查询数据 ''' pymysql基本使用步骤 使用pymysql查询数据 '''import pymysql# ...

  7. java插入数据库字符串拼接_java连接mysql数据库实现单条插入和批量插入

    本文实例为大家分享了java连接mysql数据库实现单条和批量插入的具体代码,供大家参考,具体内容如下 本文插入数据库的数据来源:java + dom4j.jar提取xml文档内容 1.连接数据库 p ...

  8. python使用PyMySQL的连接MySQL数据库

    如何实现将100000条数据插入到MySQL数据库?如果使用MySQL客户端来完成这个操作,那么这个工作量无疑是巨大的,可以通过使用程序代码的方式去连接MySQL数据库,然后对MySQL数据库进行增删 ...

  9. python链接mysql 判断是否成功_python连接mysql数据库并读取数据的实现

    1.安装pymysql包 pip install pymysql 注: MySQLdb只支持python2,pymysql支持python3 2.连接数据 import pymysql import ...

  10. 快速使用Python连接MySQL数据库的方法

    我是在Anaconda notebook中进行连接实验的,环境Python3.6,当然也可以在Python Shell里面进行操作. 最常用也最稳定的用于连接MySQL数据库的python库是PyMy ...

最新文章

  1. Spring在Java领域的统治地位:86% 的Java开发者依赖它!
  2. UPnP协议编程实践
  3. 【洛谷 2709】小B的询问
  4. 宁波大学计算机网络,宁波大学计算机网络TCP与UDP题目
  5. c# 通过内存映射实现文件共享内存
  6. 项目回顾1-图片上传-form表单还是base64-前端图片压缩
  7. LeetCode 2201. 统计可以提取的工件(哈希)
  8. Linux服务器上新增开放端口号
  9. SpringBoot+拦截器+自定义异常+自定义注解+全局异常处理简单实现接口权限管理...
  10. Varnish——CDN推送平台(web页面批量清除缓存)
  11. 网页设计软件列表HTML,十种网页设计软件
  12. 质量与规范,敬我们那些年欠下的技术债
  13. signature=2850cfcfebaece38f3ee6f56047eb922,A characteristic metabolic signature of breast cancer
  14. mysql的配置管理_MySQL 启动流程及配置管理
  15. 2019年6月4日 VIVO提前批笔试 题目3
  16. 一款APP从设计稿到切图过程全方位揭秘(IOS版)
  17. EmguCV入门(一)
  18. 什么是预言机(oracle)
  19. java游戏开发入门(十) -粒子特效
  20. Ubuntu20.04下安装 NVIDIADriver-460、CUDA-10.0、cuDNN、tensorflow、pytorch

热门文章

  1. 江苏2021高考成绩查询全省排名,江苏省高考排名对应大学-江苏考生位次查询(2021年参考)...
  2. 代码查重工具SIM,添加图形界面GUI,附下载链接
  3. [历年IT笔试题]美团2015校园招聘笔试题
  4. 行星轨迹制作_用3ds max制作三维行星运动动画
  5. 新交规驾驶证扣分什么时候清零
  6. 北京集训TEST12——PA( Mortal Kombat)
  7. C++跟C#获取电脑上连接的多个摄像头名称与编号
  8. doris core安装报错Makefile:158: recipe for target 'processor.o' failed make: *** [processor.o] Error 1
  9. CAN总线学习:zlg关于can帖子汇总
  10. java的一些学习网址。。。。。