前言
这里,我们的需求是 用xlwt 生成execl文件到内存中(这里不保存都磁盘) ,再生成email 实例 从内存中读取二进制文件流到附件中 且发送附件邮件。
提示:以下是本篇文章正文内容,下面案例可供参考
一、xlwt生成execl文件到内存中
1.引入库
python 可以操作execl的库
xlrd 、xlwt、openpyxl、xlsxwriter 等
# encoding=utf-8
import xlsxwriter # 操作xlsx 的库
from io import BytesIO # python 自带的字节io函数
from io import StringIO # python 自带的字符串io函数
import xlwt # 操作execl 库
from email.mime.text import MIMEText # 发邮件 emil 库python 自带
from email.mime.multipart import MIMEMultipart
from email.header import Header
import smtplib
代码如下(示例):
obj = BytesIO() # 创建字节内存对象
wb = xlwt.Workbook(encoding='utf-8') # 创建execl 实例
ws = wb.add_sheet('Meetings') # 创建sheet 页
row_num = 0
font_style = xlwt.XFStyle() # 设置 表头样式
font_style.font.bold = True
columns = [
'Region',
'Area'
]
for col_num in range(len(columns)):
ws.write(row_num, col_num, columns[col_num], font_style) # 向execl中添加表头列
font_style = xlwt.XFStyle()
font_style_start_time = xlwt.XFStyle() # 设置日期单元格样式
font_style_start_time.num_format_str = 'M/D/YY h:mm'
# MeetingsInfo4BO数据表
rows = MeetingsInfo4BO.objects.values_list(
'region',
'area'
)
for row in rows:
row_num += 1
for col_num in range(len(row)):
if col_num == 13 or col_num ==14:
ws.write(row_num, col_num, row[col_num], font_style_start_time) # 写入内容
else:
ws.write(row_num, col_num, row[col_num], font_style)
wb.save(obj) # 保存到 obj 内存实例中 根据使用的库不同,保存代码写法就不同。
obj.seek(0) # 将内存文件偏移量改为开始,便于邮件中读出所有内容,并发出
my_msg = create_email('发件人名称', "收件人名称", "邮件标题", "邮件正文", "附件名称/会议主数据.xls", obj.read()) # obj.read() 读取内存对象的内容
send_email('发件人邮箱', '发件人密码', ["收件人邮箱"], my_msg) # my_msg邮件实例
obj.close() # 清除内存实例
return Response({"msg": "ok", "code": 200009})
二、邮件发送步骤
1.发送附件邮件
代码如下(示例):
# encoding=utf-8
import xlsxwriter
from io import BytesIO
import xlwt
import openpyxl
import datetime
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.header import Header
import smtplib
def create_email(email_from, email_to, email_Subject, email_text, annex_name, xls):
try:
# 输入发件人昵称、收件人昵称、主题,正文,附件地址,附件名称生成一封邮件
# 生成一个空的带附件的邮件实例
message = MIMEMultipart()
# 将正文以text的形式插入邮件中
message.attach(MIMEText(email_text, 'plain', 'utf-8'))
# 生成发件人名称(这个跟发送的邮件没有关系)
message['From'] = Header(email_from, 'utf-8')
# 生成收件人名称(这个跟接收的邮件也没有关系)
message['To'] = Header(email_to, 'utf-8')
# 生成邮件主题
message['Subject'] = Header(email_Subject, 'utf-8')
# 读取附件的内容 xls 内存文件的内容
att1 = MIMEText(xls, 'base64', 'utf-8')
# att1 = MIMEText(open(r"Desktop\哈哈.xls","rb").read(), 'base64', 'gb2312') 从磁盘中读取
att1["Content-Type"] = 'application/octet-stream'
att1.add_header('Content-Disposition', 'attachment', filename=('gbk', '', annex_name))
# 将附件内容插入邮件中
message.attach(att1)
return message
except Exception as ex:
print(ex)
print("创建错误")
# 返回邮件
def send_email(sender, password, receiver, msg):
# 一个输入邮箱、密码、收件人、邮件内容发送邮件的函数
try:
# 找到你的发送邮箱的服务器地址,已加密的形式发送
server = smtplib.SMTP_SSL("smtp.mxhichina.com", 465) # 发件人邮箱中的SMTP服务器
server.ehlo()
# 登录你的账号
server.login(sender, password) # 括号中对应的是发件人邮箱账号、邮箱密码
# 发送邮件
server.sendmail(sender, receiver, msg.as_string()) # 括号中对应的是发件人邮箱账号、收件人邮箱账号(是一个列表)、邮件内容
print("邮件发送成功")
server.quit() # 关闭连接
except Exception as ex:
print("邮件发送失败", ex)
该处可能操作的时间较长,请设置uwsgi的服务器等待时间。
三、 其他execl库的使用示例
此处以 xlsxwriter 做举例:
try:
# 创建文件 xls为内存对象
workbook = xlsxwriter.Workbook(xls)
# 创建工作薄
worksheet = workbook.add_worksheet(r"Messting")
# 写入标题(第一行)
i = 0
font_style = workbook.add_format({
"bold": True
})
title = ["start_timestamp"]
worksheet.write_row(0, i, title,font_style)
j = 1
font_style_start_time = workbook.add_format({
"num_format": 'mm/dd/yyyy h:mm'
})
worksheet.write(j, 1, "2020/02/28 02:55:00",font_style_start_time)
# worksheet.write(j, 2, 'https://qiniu.hp.gimyingao.com/bayercrop/J5jUAP9mkdaXasxPXjbXAHbAyCKXr6aHXxpX32XL.jpeg,%20https://qiniu.hp.gimyingao.com/bayercrop/BFOvh4z5fT9vazyZXB77i5ilvQvoFLTFYuVnTRu1.jpeg,%20https://qiniu.hp.gimyingao.com/bayercrop/YyuRC5MNCiqkEZxpN5WGHpXPC4QCltdtI8N45OSR.jpeg')
workbook.close()
except Exception as e:
print(str(e))
区别在于 保存到 内存对象的写法不同。
- xlwt 在sava 保存函数时指定内存对象
- xlsxwriter 在创建工作簿时已经保存到内存中。
- 从内存对象中读取时一样的。
- xlsxwriter 容易出现 列内容过长超过255 字符 出现 characters since it exceeds Excel’s limit for URLS 错误
四、 Cstring 和 StringIO
python2 下是Cstring 库 是c语言写的运行速度较快。 import Cstring
python3后 都是从IO 对象中 使用StringIO和 BytesIO 函数 from io import StringIO
总结
提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅简单介绍了操作内存文件和发邮件的使用,具体发附件 内存文件或磁盘文件 可根据自己的实际情况进行选定。