Python Excel 導出 + 發送郵件

一、依賴模塊

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)

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章