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。

 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号