利用python将Mysql信息以Excel文件并作为邮件附件发送
程序员文章站
2022-06-15 11:50:05
提示由于当前系统一直使用的是python2.7版本,因此先以这个版本来完成这个代码,python3的区别不是很大,适当调整一下就可以完成。前言日常操作用java其实完成起来也是比较方便的,但是在非日常维护期间总有时候会出一些幺蛾子,需要对某些很小的细节进行改动,却又是一次性的,这样用java去操作有时候就会显得有些复杂。而python脚本的话可以很轻量的去处理一些问题,代价只是做几个简简单单的配置。因此这里记录一下最近整理的利用python去处理sql指定信息并生成excel作为附件发送邮件的代码。...
提示
由于当前系统一直使用的是python2.7版本,因此先以这个版本来完成这个代码,python3的区别不是很大,适当调整一下就可以完成。
前言
日常操作用java其实完成起来也是比较方便的,但是在非日常维护期间总有时候会出一些幺蛾子,需要对某些很小的细节进行改动,却又是一次性的,这样用java去操作有时候就会显得有些复杂。而python脚本的话可以很轻量的去处理一些问题,代价只是做几个简简单单的配置。因此这里记录一下最近整理的利用python去处理sql指定信息并生成excel作为附件发送邮件的代码。
废话不多说,直接走起来:
1.先配置好需要用到的包
这里主要是用到了1.处理xlsx 2.发送email 3.操作mysql这三个包
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import datetime
import openpyxl
from openpyxl.styles import Font, colors, Alignment
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.application import MIMEApplication
from email.header import Header
import MySQLdb
2.查找数据库数据
get_fields(sql)会在后面遍历成为excel的内容标题,get_datas(sql)会将具体内容信息在后面遍历,具体sql内容在后面调用这几个方法中写入sql即可
#获取具体信息
def get_datas(sql):
# 跟数据库建立连接
db = _get_db("test")
cursor = db.cursor()
# 使用 execute() 方法执行 SQL
cursor.execute(sql)
# 获取所需要的数据
datas = cursor.fetchall()
#关闭连接
cursor.close()
#返回所需的数据
return datas
#获取备注字段 接下来会被用作生成excel的字段标题
def get_fields(sql):
# 跟数据库建立连接
db = _get_db("test")
cursor = db.cursor()
# 使用 execute() 方法执行 SQL
cursor.execute(sql)
# 获取所需要的数据
fields = cursor.description
cursor.close()
return fields
def _get_db(database_name):
db = MySQLdb.connect(host="localhost",user="gupanghu",passwd="gupanghu",
db=str(database_name),port=3306,charset='utf8')
return db
3.生成excel文件
make_excel(data,field,file)中的data,field分别是上述的get_datas(sql),get_fields(sql)获得的值,具体的会在主流程中一起展示,为了方便理解,先将其拆分品。。呃。也没啥好品的,随便看看。
备注:其实有很多地方我原本是做成配置的,因为等脚本写完之后,不同场景只需要调整参数,但是为了方便阅读,我暂时将这些参数全都写死,例如sheet名,文件名,主题名等等
# 将数据和字段名写入excel的函数
def make_excel(data, field, file):
#新建一个工作薄对象
new = openpyxl.Workbook()
#激活一个新的sheet
sheet = new.active
#给sheet命名
sheet.title = 'sheet'
#将字段名称循环写入excel第一行
for col in range(len(field)):
#row代表行数,column代表列数,value代表单元格输入的值
_ = sheet.cell(row=1, column=col+1, value=u'%s' % field[col][0].decode('utf-8'))
#设置字体风格
_.font = Font(name = u"宋体",size= 12,color=colors.BLACK,bold=False,italic=False)
_.alignment = Alignment(horizontal='center')
#设置单元格属性
sheet.row_dimensions[1].height = 25
for col in range(len(field)):
width = 20
for row in range(len(data)):
#因为第一行写了字段名称,所以要从第二行开始写入
_ = sheet.cell(row=row+2, column=col + 1, value=u'%s' % data[row][col])
if len(str(data[row][col]).decode('utf8'))>width:
width = len(str(data[row][col]).decode('utf8')) + 2
sheet.column_dimensions[chr(col + 65)].width = width
newworkbook = new.save(file)
#返回生成的excel
print '文件生成成功'
return newworkbook
4.发送邮件附件
这里的几个发送人邮箱,授权码,收件人邮箱,以及服务器端口号等参数都是必填的,具体操作方式可以看下SMTP教程
def Send_email_text(subject, content, filepath, receive_email):
sender = '' #发送人邮箱
passwd = '' #授权码
receivers = ['',''] #收件人邮箱 可多选
host = '' #服务器
port = '' #端口号
msgRoot = MIMEMultipart()
msgRoot['Subject'] = Header(subject,'utf-8')
msgRoot['From'] = sender
if len(receivers) > 1:
msgRoot['To'] = ','.join(receivers) # 群发邮件
else:
msgRoot['To'] = receivers[0]
part = MIMEText(content,'plain','utf-8')
msgRoot.attach(part)
##添加附件部分
for path in filepath:
if ".xlsx" in path:
# xlsx类型附件
xlsx_name = path.split("\\")[-1]
path = path.decode('utf8')
part = MIMEApplication(open(path, 'rb').read())
part.add_header('Content-Disposition', 'attachment', filename=xlsx_name)
msgRoot.attach(part)
try:
s = smtplib.SMTP()
s.connect(host, port)
s.login(sender, passwd)
s.sendmail(sender, receivers, msgRoot.as_string())
print ("邮件发送成功")
except smtplib.SMTPException as e:
print("Error, 发送失败")
finally:
s.quit()
5.最后就是合并的主方法
def main():
print(datetime.datetime.now())
my_sql = '''
select id as 'Num',time as 'Time'
from t_test_demo
where amount > 100
'''
# 生成数据
my_data = get_datas(my_sql)
# 生成字段名称
my_field = get_fields(my_sql)
# 文件名称
my_file_name = ('test'+ '.xlsx')
# 文件路径
file_path = 'D:\\file\\' + my_file_name
# 生成excel
make_excel(my_data, my_field, file_path)
file_path = [file_path] # 发送三个文件到两个邮箱
receive_email = to_addr
Send_email_text('project', 'content', file_path, receive_email)
print(datetime.datetime.now())
if __name__ == '__main__':
main()
print '当前业务处理时间:%s' % (datetime.datetime.today())
本文地址:https://blog.csdn.net/weixin_42887211/article/details/107638357