python实例—利用pymysql查询上月数据并制作excel发送至邮箱
admin
2023-03-02 07:02:30
0


脚本如下:


#!/user/bin/python

#-*-coding: utf-8-*-

# 1.登录数据库查询数据 2.将查询的数据生成excel文件 3.xls文件通过邮件发送



# 导入模块:pymysql模块用于登录数据库等相关操作(python3),python2中使用mysqldb模块,需自行安装:pip3 install pymysql

#           xlwt用于生成excel文件,需自行安装:pip3 istall xlwt

#           smtplib与email为python自带模块,用于邮件的发送



import datetime


import pymysql


import xlwt


import smtplib


from email.mime.multipart import MIMEMultipart


from email.mime.text import MIMEText


from email.mime.application import MIMEApplication



# 定义数据查询日期

# datetime.timedelta 时间加减

# datetime.date.today()       2019-10-25

# tmf_day 本月第一天          2019-10-01

# lme_day 上月最后一天        2019-09-30

# lmf_day 上月第一天          2019-09-01

# datetime.datetime.now()     2019-10-25 11:03:52

# today_zero 今天的零时       2019-10-25 00:00:00

# tmf_zero 本月的第一个零时   2019-10-01 00:00:00

# lme_minute 上月的最后一分钟 2019-09-30 23:59:59


today = datetime.date.today()


tmf_day = today.replace(day=1)


lme_day = tmf_day - datetime.timedelta(days=1)


lmf_day = lme_day.replace(day=1)


now = datetime.datetime.now()


today_zero = now - datetime.timedelta(hours=now.hour, minutes=now.minute, seconds=now.second)


tmf_zero = today_zero.replace(day=1)


lme_minute = tmf_zero - datetime.timedelta(hours=0, minutes=0, seconds=1)



# 1.登录数据库

# myconn 定义连接数据库语句

# pymysql.cursors.DictCursor会输出字典格式,pymysql.cursors.Cursor默认情况下cursor方法返回的是BaseCursor类型对象,BaseCursor类型对象在>执行查询后每条记录的结果以列表(list)表示。

# query_sql 定义查询语句

# mycursor.fetchmany(x)接收x个数据结果,mycursor.fetchall()接收所有数据结果。

# mycursor.close()查询结束

# myconn.close()断开连接


# 传递单个参数:field = '-'

#               sql_talk="UPDATE cnp.Test set a='' where b='%s'"

#               cursor.execute(sql_talk % field)

# 传递多个参数:使用{0}占位符

#               field = '-'

#               a = 'code'

#               sql_talk="UPDATE cnp.Test set {0}='' where business_registration_code='{1}'".format(a,field)

#               cursor.execute(sql_talk)

# 或者           

#               cur.execute("select score from class_info where sex='%s' and age=%d" % ('XX','XX')) %s表示字符,%d表示整型


myconn = pymysql.connect(host='192.168.42.128',user='XXXX',passwd='xxxx',database='test',charset="utf8")


mycursor = myconn.cursor(cursor=pymysql.cursors.Cursor)


query_sql = """

SELECT  conference_number,conference_title,conference_name,ccs_login_name,start_time,amount FROM `cost_08` where end_time between '%s' and '%s'

"""


mycursor.execute(query_sql % (lmf_day,lme_minute))


query_result=mycursor.fetchall() 


mycursor.close()


myconn.close()



# 2.生成excel文件

# excel的位置坐标为0开始,第一行第一列为(0,0),第一行第二列(0,1),第二行第一列(1,0)...

# list1 第一行,用于生成需要查询的字段

# wbk.add_sheet创建worksheet,相当于excel中的的sheet1

# xlwt.XFStyle()初始化样式

# datastyle.num_format_str 设置excel单元格格式



list1 = ('第一列','第二列','第三列','第四列','第五列','第六列')


wbk = xlwt.Workbook(encoding='utf-8')


worksheet = wbk.add_sheet('My worksheet')


datastyle = xlwt.XFStyle()


datastyle.num_format_str = 'yyyy-mm-dd hh:mm:ss'



# len(list1):list1的长度,用于表示list1的字段数

# list 查询结果的数据列数,即需要查询的字段数

# worksheet.write:将元素写入对应的表格中

# worksheet.write(0,list,list1[list]):将list1的相应字段填入第一行,及需要查询的字段。

# row 查询结果的条数数,即共查询到多少条记录。(0,0)已填入数据,所以从(1,0)开始,row+1行结束。

# list循环到第四列时,设置excel单元格格式,其余列未设置格式,循环不变。

# worksheet.write(row+1,list,query_result[row][list])等同于:worksheet.write(row+1,0,query_result[row][0])

# 如查询结果为('1,2','2,3','3,4')则:

# (1,0)结果为1  (1,1)结果为2           12

# (2,0)结果为2  (2,1)结果为3           23

# (3,0)结果为3  (3,1)结果为4           34

# wbk.save 保存文件,后跟文件名称

  


for list in range (0,len(list1)):


    worksheet.write(0,list,list1[list])


    for row in range(0,len(query_result)):


        if list == 4:


   

           worksheet.write(row+1,4,query_result[row][4],datastyle)

    

        else:

            

           worksheet.write(row+1,list,query_result[row][list])

 

wbk.save('xx.xls')



# 3.定义发送邮件函数

# def send_email():   定义函数

# msg = MIMEMultipart()用于构建带附件的实例

# msg["Subject"] 邮件主题

# msg["From"] = user 发件人

# msg["To"] = to 收件人

# part1 = MIMEText("你好,\n\n       顶育上月使用数据见附件。") 构建纯文本文件

# msg.attach(part1) attach表示固定,用于构建邮件内容

# part2 = MIMEApplication(open(r'C:\Users\Administrator.USER-20190917HT\Desktop\顶育.xls','rb').read()) 构建附件1

# open(r'C:\Users\Administrator.USER-20190917HT\Desktop\顶育.xls','rb').read()   以二进制只读方式打开xx文件

# 等同于  f = open('test.txt')

#           f.read()

# rb二进制只读模式  'r'读模式、'w'写模式、'a'追加模式、'b'二进制模式、'+'读/写模式。

# open(r'C:\)    r'是防止字符转义的 如果路径中出现'\t'的话 不加r的话\t就会被转义 而加了'r'之后'\t'就能保留原有的样子

# part2.add_header('Content-Disposition','attachment',filename='顶育.xls') 头部消息,filename可以任意写,写什么名字,邮件中显示什么名字

# smtplib.SMTP("smtp.139.com",timeout=30) 发件人邮箱中的SMTP服务器,默认端口是25

# s.login(user,pwd)登录邮箱

# send_email()调用函数



def send_email():

    user = 'xxxxxx@139.com'

  

    pwd = 'xxxxxxx'

  

    to = 'xxxxxx@qq.com'

  

    msg = MIMEMultipart()

  

    msg["Subject"] = 'xxxx上月使用情况统计'

  

    msg["From"] = user

  

    msg["To"] = to

    

    part1 = MIMEText("你好,\n\n       xxxx上月使用数据见附件。")

    

    msg.attach(part1)

  

    part2 = MIMEApplication(open(r'C:\Users\Administrator.USER-20190917HT\Desktop\xx.xls','rb').read())

    

    part2.add_header('Content-Disposition','attachment',filename='xx.xls')

    

    msg.attach(part2)

    

    s = smtplib.SMTP("smtp.139.com",timeout=30)


    s.login(user,pwd)


    s.sendmail(user,to,msg.as_string())   


    s.close()


    send_email()

    


相关内容

热门资讯

20名“高考状元”选择学医!此... 2026年香港高考的24名“状元”中,有20人明确表示将留港攻读医科。多年来,香港最顶尖的“学霸们”...
“抢人大战”,风向有变? 各地一场“抢老人”的大战,已然徐徐拉开大幕。最近,有着人口净流出压力的吉林,计划拿出3亿元发展旅居康...
石家庄一家不限量的爱心素食面馆... 7月24日正午时分,记者来到位于石家庄市新华区东明家居西二环店北门旁的“素面”小店,不大的店面里坐满...
中材科技申请风电叶片外补强辅助... 国家知识产权局信息显示,中材科技(伊吾)风电叶片有限公司申请一项名为“风电叶片外补强辅助固化装置”的...
为人工智能治理提供重要公共产品 图为2026世界人工智能大会暨人工智能全球治理高级别会议举办期间,在世博展览馆灵心巧手展位,参观者观...
泽连斯基称俄对乌多地发动大规模... 当地时间25日,乌克兰总统泽连斯基通报称,俄军于当日凌晨对乌克兰多地发动大规模空袭,使用2枚导弹、近...
不怕没水!武汉科学家找到水稻身... 干旱来了,水稻启动"抗旱模式",可一启动就长不大、结得少——这是困扰育种界几十年的老难题。7月23日...
多款手机涨价超1000元,大存... 今年暑期消费旺季,国内智能手机市场迎来一轮显著的价格上调。第一财经记者走访深圳多家品牌门店发现,以v...
SpaceX上市后星舰首飞:首... 界面新闻实习记者 | 李响 在经历多次波折后,SpaceX公司的星舰(Starship)终于完成了...
博世洗衣机强制解锁 博世洗衣机强制解锁的方法可能因型号和具体情况而异。以下是一些常见的方法:1. 按住电源键:有些博世洗...