一、依賴模塊
1.excel導出依賴xlwt或者xlsxwriter
xlwt只能支持65535行,較大數據量可以選用xlsxwriter;
python 字符默認是ascii編碼,導出時轉化爲udf-8格式
2.發送郵件依賴smtplib
發送附件時,必須用starttls(),保證安全性
二、代碼
# -*- coding: UTF-8 -*-
import sys
import psycopg2
import MySQLdb
import calendar
import datetime
import time
import xlsxwriter
from DBContainer import *
from Utils.logs_util import LoggerUtils
import smtplib
from email.mime.text import MIMEText
from email.header import Header
from email.mime.multipart import MIMEMultipart
if sys.getdefaultencoding() != 'utf-8':
reload(sys)
sys.setdefaultencoding('utf-8')
'''
M+2 teacher
@author:kangkai
@date:2018-12-03
'''
logger = LoggerUtils.getLogger('M2Teacher')
class M2Teacher:
def __init__(self, dt):
self.dt = dt
def get_m2teacher(self):
yes_time = self.dt
yes_time1 = yes_time.strftime('%Y-%m-%d')
today_time = yes_time + datetime.timedelta(days=1)
today_time1 = today_time.strftime('%Y-%m-%d')
firstday = yes_time.replace(day=1).strftime('%Y-%m-%d')
conn = psycopg2.connect(database=DBContainer.database_gp,
user=DBContainer.user_gp,
password=DBContainer.password_gp,
host=DBContainer.host_gp,
port=DBContainer.port_gp)
cur = conn.cursor()
print("===select m2teacher===")
sql = '''select a.teacher_id,a.teacher_name,a.school_name,a.province_name,a.city_name,a.county_name,count(student_id) from o_student_stat a
group by a.teacher_id,a.teacher_name,a.school_name,a.province_name,a.city_name,a.county_name
order by f.province_name,e.city_name,d.county_name,c.name
'''
# print sql
cur.execute(sql)
results = cur.fetchall() # all rows in table
cur.close()
conn.close()
return results
def write_data_to_excel(self,file_name):
result = self.get_m2teacher()
# 實例化一個Workbook()對象(即excel文件),xlwt只能支持65535行,改爲xlsxwriter
wbk = xlsxwriter.Workbook(file_name)
# 新建一個名爲Sheet1的excel sheet。此處的cell_overwrite_ok =True是爲了能對同一個單元格重複操作。
sheet_name = 'sheet1'
sheet = wbk.add_worksheet(sheet_name)
header = [u'老師id', u'老師姓名', u'學校名稱', u'省名稱', u'城市名稱', u'區縣名稱', u'M+2學生數']
h = 0
# 寫表頭
for each_header in header:
sheet.write(0, h, each_header)
h += 1
# 遍歷result中的每個元素。
for i in xrange(len(result)):
# 對result的每個子元素作遍歷,
for j in xrange(len(result[i])):
# 將每一行的每個元素按行號i,列號j,寫入到excel中。
# python 字符默認是ascii編碼,導出時轉化爲udf-8格式
# 由於表頭存在,插入時從下一行開始,因此用i+1
sheet.write(i+1, j, u'%s' % result[i][j])
wbk.close()
def sendmail(self,file_name):
# 第三方 SMTP 服務
mail_host = "smtp.exmail.qq.com" # 設置服務器
mail_user = "root" # 用戶名
mail_pass = "password" # 口令
sender = '[email protected]'
receivers = ['[email protected]'] # 接收郵件
subject = 'M+2老師統計表'
# 創建一個帶附件的實例
message = MIMEMultipart()
message['From'] = Header(sender, 'utf-8')
message['To'] = Header(",".join(receivers), 'utf-8')
message['Subject'] = Header(subject, 'utf-8')
# 郵件正文內容
message.attach(MIMEText('Deal all,\n附件是"M+2老師統計"導出的數據,請查收!', 'plain', 'utf-8'))
# 附件
# file_path = '/Users/kangkai/PycharmProjects/KBDataProcessing/deepblue/'
# out_path = file_path + file_name
att = MIMEText(open(file_name, 'rb').read(), 'base64', 'utf-8')
att["Content-Type"] = 'application/octet-stream'
att['Content-Disposition'] = 'attachment; filename ="%s"' % file_name
message.attach(att)
try:
smtpObj = smtplib.SMTP()
smtpObj.connect(mail_host, 25)
smtpObj.starttls()
smtpObj.login(mail_user, mail_pass)
smtpObj.sendmail(sender, receivers, message.as_string())
logger.info("郵件發送成功")
smtpObj.quit()
except smtplib.SMTPException:
logger.info("Error: 無法發送郵件")
return
if __name__ == '__main__':
dt = datetime.datetime.now() + datetime.timedelta(days=-1)
# dt = datetime.date(2018,10,11)
run = M2Teacher(dt)
today = datetime.datetime.now()
today_date = today.strftime('%Y%m%d')
# 以傳遞的name+當前日期作爲excel名稱保存。
file_name = 'm2teacher-' + str(today_date) + '.xlsx'
run.write_data_to_excel(file_name)
run.sendmail(file_name)