通過Python實現生成excel並郵件發送的功能


1.需求描述

因業務方需求,在一個月內,需要每天從數據庫中收集、匯聚相關數據,形成3份excel,然后發給相關人。工作雖然簡單,但是還是需要花費大家的時間和經歷,所以,通過一份簡單的python代碼來實現此功能。

 2.執行文件

3.代碼實現

Python 的運行環境:Python 2.7.5

3.1 郵件配置文件

郵件配置文件smtp_conig.py,可參閱  https://www.cnblogs.com/xuliuzai/p/14156559.html 的發送郵件的模塊smtp_config.py,在此不再贅述。

3.2 數據庫配置文件

數據庫配置文件為db_weixindb_conn.py和db_qqdb_conn.py,因為是連接不同實例上的兩個數據庫,所以,我們將配置信息放在了兩個文件中。其具體的配置可參照

https://www.cnblogs.com/xuliuzai/p/14721413.html 中的《db_conn.py》文件。

3.3 功能代碼

主要執行文件report_excel_mail_.py的代碼如下 

#!/usr/bin/python
# -*- coding: UTF-8 -*-

import sys
reload(sys)
sys.setdefaultencoding( "utf-8" )
import db_weixindb_conn
import db_qqdb_conn
import os
import time
import smtp_config
from email.mime.text import MIMEText
from email.header import Header
from email.mime.image import MIMEImage
from email.mime.multipart import MIMEMultipart
from email.mime.application import MIMEApplication
##引入生成excel庫
import string
import xlsxwriter
import datetime

def send_mail(mail_msg):
    # 調用send_mail函數
    mail_body = """
    <style type="text/css">
    </style>
    <html><font color=#0000CC>Dear All,<br><br>&nbsp;&nbsp;&nbsp;本郵件為QQ Order 維護部分測試郵件。主要用來測試生成excel,並且以郵件的形式發送的功能,請互理。</html>
     """
    mail_body = mail_body + mail_msg
    message = MIMEText(mail_body, 'html', 'utf-8')
    msg = MIMEMultipart()
    msg.attach(message)
    msg.attach(xlsxpart_publish)
    msg.attach(xlsxpart)
    msg.attach(xlsxpart_slow)

    subject = 'BBChat日報'
    msg['Subject'] = Header(subject, 'utf-8')
    smtp_config.send_mail(msg)
    return

###查詢的時間范圍
### TypeError: strptime() argument 0 must be str, not <class 'datetime.datetime'>
e_time = (datetime.datetime.now() + datetime.timedelta(-1)).strftime('%Y-%m-%d')
s_time = (datetime.datetime.now() + datetime.timedelta(-8)).strftime('%Y-%m-%d')

# 定義時間標志變量
sheet_time = datetime.datetime.now()
sheet_mark = sheet_time.strftime('%Y-%m-%d')
book_mark = sheet_time.strftime('%Y%m%d')

# 定義輸出excel文件名
workbook_publish = xlsxwriter.Workbook('BBChat_App_publish_'+book_mark+'.xlsx')
# 定義sheet的名字
worksheet_publish = workbook_publish.add_worksheet(sheet_mark)
# 定義sheet中title的字體format
bold_publish = workbook_publish.add_format({'bold': True})

# 定義輸出excel文件名
workbook_slow = xlsxwriter.Workbook('BBChat_App_slow_'+book_mark+'.xlsx')
# 定義sheet的名字
worksheet_slow = workbook_slow.add_worksheet(sheet_mark)
# 定義sheet中title的字體format
bold_slow = workbook_slow.add_format({'bold': True})

# 定義輸出excel文件名
workbook = xlsxwriter.Workbook('BBChat_App_'+book_mark+'.xlsx')
# 定義sheet的名字
worksheet = workbook.add_worksheet(sheet_mark)
# 定義sheet中title的字體format
bold = workbook.add_format({'bold': True})

#定義郵件體變量
mail_msg = ""

# 獲取數據庫連接
db = db_weixindb_conn.db
db_qqdb = db_qqdb_conn.db
# 使用cursor()方法獲取操作游標
cursor = db_qqdb.cursor()
# SQL 查詢語句
# 備份日報
sql_apppublish_report = " select q_id,q_title,q_app_id,q_status,q_r_type,q_creator,q_create_time from qq_release " \
                     " where q_create_time>= %s and q_create_time< %s  " \
                     " and status != 0; "
try:
    # 執行SQL語句
    cursor.execute(sql_apppublish_report,(s_time,e_time))
    # 獲取所有記錄列表
    results = cursor.fetchall()
    # 查詢數據結果和字段名字 賦值給兩個變量
    ##result = cur.fetchall() ##前面已經賦值
    fields = cursor.description # get column name

    ## 將結果寫入excel中
    ## 定義title的坐標:row=0,col=0~字段總數 也就是excel的第一行:0,0  ~ 0,len(fields),通過fields[field][0] 獲取字段名
    for field in range(0,len(fields)):
      worksheet_publish.write(0,field,fields[field][0],bold_publish)

    for row in range(1,len(results)+1):
      for col in range(0,len(fields)):
        worksheet_publish.write(row,col,u'%s' % results[row-1][col])

    workbook_publish.close()

    ##添加郵件附件,xlsx類型的附件
    xlsxFile_publish = '/data/scripts/' + 'BBChat_App_publish_'+book_mark+'.xlsx'
    xlsxpart_publish = MIMEApplication(open(xlsxFile_publish, 'rb').read())
    xlsxpart_publish.add_header('Content-Disposition', 'attachment', filename=xlsxFile_publish)
    ##attachfile = xlsxpart
    ##發送郵件
    #send_mail(mail_msg)

except  Exception as e:
    print str(Exception)
    print str(e)
# 關閉游標
cursor.close()
# 關閉數據庫連接
db_qqdb.close()

####調用存儲生成數據
# 使用cursor()方法獲取操作游標
cursor = db.cursor()
try:
    cursor.execute('CALL usp_collect_appBBChat()')
except  Exception as e:
    print str(Exception)
    print str(e)
db.commit ###因為默認的autocommit = false,SP中有增、刪、改,必須顯示commit,才能提交落庫。 cursor.close()
####數據生成 #### 生成第二個文件 # 使用cursor()方法獲取操作游標 cursor = db.cursor() # SQL 查詢語句 # 備份日報 sql_app_report = " select t1.topic,t1.cnt_1,t2.cnt_2 from " \ " ( select topic,count(*) as cnt_1 from qqapp_alertlog_2 group by topic ) t1 " \ " join " \ " ( select topic,count(*) as cnt_2 from ( select distinct topic,api_id from qqapp_alertlog_2 ) t group by topic ) t2 on t1.topic = t2.topic " \ " order by cnt_1 desc; " try: # 執行SQL語句 cursor.execute(sql_app_report) # 獲取所有記錄列表 results = cursor.fetchall() # 查詢數據結果和字段名字 賦值給兩個變量 ##result = cur.fetchall() ##前面已經賦值 fields = cursor.description # get column name ## 將結果寫入excel中 ## 定義title的坐標:row=0,col=0~字段總數 也就是excel的第一行:0,0 ~ 0,len(fields),通過fields[field][0] 獲取字段名 for field in range(0,len(fields)): worksheet.write(0,field,fields[field][0],bold) for row in range(1,len(results)+1): for col in range(0,len(fields)): worksheet.write(row,col,u'%s' % results[row-1][col]) workbook.close() ##添加郵件附件,xlsx類型的附件 xlsxFile = '/data/scripts/' + 'BBChat_App_'+book_mark+'.xlsx' xlsxpart = MIMEApplication(open(xlsxFile, 'rb').read()) xlsxpart.add_header('Content-Disposition', 'attachment', filename=xlsxFile) ##### 生成第二個文件 End ### ##send_mail(mail_msg) except Exception as e: print str(Exception) print str(e) # 關閉游標 cursor.close() # 關閉數據庫連接 #db.close() #### 生成第三個文件 # 使用cursor()方法獲取操作游標 cursor = db.cursor() # SQL 查詢語句 # 備份日報 sql_app_slow = " select id, core_api, post_time,topic,app_id, api_id,method,cnt, taken_avg,fail_cnt,fail_per " \ " from qqapp_alertlog_2 " try: # 執行SQL語句 cursor.execute(sql_app_slow) # 獲取所有記錄列表 results = cursor.fetchall() # 查詢數據結果和字段名字 賦值給兩個變量 ##result = cur.fetchall() ##前面已經賦值 fields = cursor.description # get column name ## 將結果寫入excel中 ## 定義title的坐標:row=0,col=0~字段總數 也就是excel的第一行:0,0 ~ 0,len(fields),通過fields[field][0] 獲取字段名 for field in range(0,len(fields)): worksheet_slow.write(0,field,fields[field][0],bold_slow) for row in range(1,len(results)+1): for col in range(0,len(fields)): worksheet_slow.write(row,col,u'%s' % results[row-1][col]) workbook_slow.close() ##添加郵件附件,xlsx類型的附件 xlsxFile_slow = '/data/scripts/' + 'BBChat_App_slow_'+book_mark+'.xlsx' xlsxpart_slow = MIMEApplication(open(xlsxFile_slow, 'rb').read()) xlsxpart_slow.add_header('Content-Disposition', 'attachment', filename=xlsxFile_slow) ##### 生成第二個文件 End ### send_mail(mail_msg) except Exception as e: print str(Exception) print str(e) # 關閉游標 cursor.close() # 關閉數據庫連接 db.close()

 4.功能實現

經過測試驗證,滿足生產要求。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM