python xlwt 生成execl文件且发送附件邮件


前言

这里,我们的需求是 用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))

区别在于 保存到 内存对象的写法不同。

  1. xlwt 在sava 保存函数时指定内存对象
  2. xlsxwriter 在创建工作簿时已经保存到内存中。
  3. 从内存对象中读取时一样的。
  4. 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

总结

提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅简单介绍了操作内存文件和发邮件的使用,具体发附件 内存文件或磁盘文件 可根据自己的实际情况进行选定。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

NET安梓晨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值