Python Excel实战项目+邮件发送

项目代码

#导入xlrd模块
import xlrd
import xlsxwriter
import smtplib   #仅负责电子发送
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.mime.application import MIMEApplication
#1.读取数据
data = xlrd.open_workbook("data.xlsx")

#定义数组存储各班的信息
classinfo = []

#遍历所有工作表
for sheet in data.sheets():
    #定义字典,图表各项参数
    dict={'name':sheet.name,'avgsalary':0}  #班级信息
    sum=0 #存储薪资
    #遍历每个工作表有效的行
    for i in range(sheet.nrows):
        if i>1:
             #判断是否是第三行,数值在第三行开始
            sum+=float(sheet.cell(i,5).value)  #得到薪资
            #薪资赋值
            dict['avgsalary'] = sum/(sheet.nrows-2)
            #添加到classinfo存储
            classinfo.append(dict)
print(classinfo)

#2.写入Excel
workbook = xlsxwriter.Workbook('newinfo.xlsx')
sheet = workbook.add_worksheet()
#写入班级数据
nameinfo = []
salaryinfo = []
#遍历统计的classinfo拆分到上述变量中
for item in classinfo:
    nameinfo.append(item['name'])
    salaryinfo.append(item['avgsalary'])
sheet.write_column('A1',nameinfo)    #写入到A1
sheet.write_column('B1',salaryinfo)  #写入到B1

#写入图表
chart = workbook.add_chart({'type':'column'})
#设置标题
chart.set_title({'name':'平均就业薪资'})
#数据源
chart.add_series({
      'name':'班级',   #图表指示名称
      'categories':'=Sheet1!$A$1:$A$3',  #每个柱状图的名称
      'values':'=Sheet1!$B$1:$B$3',
    })
sheet.insert_chart('A7',chart)  #位置  对象
#关闭保存
workbook.close()

#3.发送到指定邮箱
host_server = 'smtp.qq.com' #主机地址
#发件人的邮箱
sender = "xxx@qq.com"
#发件人邮箱密码、授权码
code = 'swasdelcftggghji'
#收件人邮箱
userl = 'xxx@qq.com'
#准备邮箱数据
    #邮件的标题
mail_title = "一月就业的平均薪资"
    #邮件内容
mail_content = "一月就业的平均薪资,请查看附件"
    #构建附件数据
attachment = MIMEApplication(open("newinfo.xlsx",'rb').read())
#请求头  MIME协议  附件  文件名称
attachment.add_header('Content-Disposition','attachment',filename='data.xlsx')

#构建SMTP对象
smtp = smtplib.SMTP(host_server)  #主机地址

#登陆
smtp.login(sender,code)  #发件人和密码
#发送
msg = MIMEMultipart()  #带附件的实例
msg['Subject'] = mail_title   #邮件标题
msg['From'] = sender          #发件人
msg['To'] = userl             #收件人
msg.attach(MIMEText(mail_content))    #正文内容
msg.attach(attachment)     #附件

smtp.sendmail(sender,userl,msg.as_string()) #发件人  收件人

项目分析

 项目总共分三步,每步的模块都要先导入

#导入xlrd模块,读取表格
import xlrd
#导入xlsxwriter,写入表格
import xlsxwriter
#导入smtplib相关模块,发送邮件
import smtplib   #仅负责电子发送
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.mime.application import MIMEApplication

 

第一步:读取数据

#1.读取数据
data = xlrd.open_workbook("data.xlsx")

#定义数组存储各班的信息
classinfo = []

#遍历所有工作表
for sheet in data.sheets():
    #定义字典,图表各项参数
    dict={'name':sheet.name,'avgsalary':0}  #班级信息
    sum=0 #存储薪资
    #遍历每个工作表有效的行
    for i in range(sheet.nrows):
        if i>1:
             #判断是否是第三行,数值在第三行开始
            sum+=float(sheet.cell(i,5).value)  #得到薪资
            #薪资赋值
            dict['avgsalary'] = sum/(sheet.nrows-2)
            #添加到classinfo存储
            classinfo.append(dict)
print(classinfo)

使用xlrd的open_workbook()方法读取数据data.xlsx文件,定义classinfo数组存储每个工作表最后提取出的数据;遍历所有工作表,定义dict字典存储每个工作表的两项数据,再遍历每个工作表的每一行,使用sum存储总薪资取平均,然后将dict添加到classinfo数组

第二步:写入数据

#2.写入Excel
workbook = xlsxwriter.Workbook('newinfo.xlsx')
sheet = workbook.add_worksheet()
#写入班级数据
nameinfo = []
salaryinfo = []
#遍历统计的classinfo拆分到上述变量中
for item in classinfo:
    nameinfo.append(item['name'])
    salaryinfo.append(item['avgsalary'])
sheet.write_column('A1',nameinfo)    #写入到A1
sheet.write_column('B1',salaryinfo)  #写入到B1

#写入图表
chart = workbook.add_chart({'type':'column'})
#设置标题
chart.set_title({'name':'平均就业薪资'})
#数据源
chart.add_series({
      'name':'班级',   #图表指示名称
      'categories':'=Sheet1!$A$1:$A$3',  #每个柱状图的名称
      'values':'=Sheet1!$B$1:$B$3',
    })
sheet.insert_chart('A7',chart)  #位置  对象
#关闭保存
workbook.close()

写入Excel不使用xlwt模块的原因是此模块不支持xlsx后缀的文件,使用xlsxwriter代替;xlsxwriter的Workbook()获取工作簿,然后使用add_worksheet()新建工作表,使用for循环遍历classinfo存储的两种变量分别放到nameinfo和salaryinfo两个数组中,然后再使用sheet工作表write_column()方法写入到表格的两列中;工作表add_chart创建图表对象,chart.set_title()设置图表标题,参数为键值对name:文件名,使用add_series()添加数据源,参数再源代码中有注释,sheet..insert_chart()插入图表,第一个参数插入位置,第二参数插入图表名称,然后使用workwork.close()关闭保存

第三步:发送指定邮箱

#3.发送到指定邮箱
host_server = 'smtp.qq.com' #主机地址
#发件人的邮箱
sender = ""
#发件人邮箱密码、授权码
code = 'swasdelcftggghji'
#收件人
userl = ''
#准备邮箱数据
    #邮件的标题
mail_title = "一月就业的平均薪资"
    #邮件内容
mail_content = "一月就业的平均薪资,请查看附件"
    #构建附件数据
attachment = MIMEApplication(open("newinfo.xlsx",'rb').read())
#请求头  MIME协议  附件  文件名称
attachment.add_header('Content-Disposition','attachment',filename='data.xlsx')

#构建SMTP对象
smtp = smtplib.SMTP(host_server)  #主机地址

#登陆
smtp.login(sender,code)  #发件人和密码
#发送
msg = MIMEMultipart()  #带附件的实例
msg['Subject'] = mail_title   #邮件标题
msg['From'] = sender          #发件人
msg['To'] = userl             #收件人
msg.attach(MIMEText(mail_content))    #正文内容
msg.attach(attachment)     #附件

smtp.sendmail(sender,userl,msg.as_string()) #发件人  收件人

发送邮件分三步,登陆、写邮件、发送邮件

登陆:登陆就需要指定服务器主机地址、发件人的邮箱、发件人邮箱密码(授权码)、收件人邮箱等参数,使用login()方法登陆,之前需要使用smtplib.SMTP()构建SMTP对象

写邮件:邮件的标题、邮件的内容、附件,使用MIMEMultipart()实例化附件

发送:使用sendmail()方法发送邮件,参数依次为发件人、收件人、发送内容,as_string(方法是将msg(MIMEText对象或者MIMEMultipart对象)变为str。

posted @ 2022-10-01 08:10  Crown-V  阅读(325)  评论(0)    收藏  举报