赞
踩
相关文章:
python处理Excel实现自动化办公教学(含实战)【一】
python处理Excel实现自动化办公教学(含实战)【二】
python处理Excel实现自动化办公教学(数据筛选、公式操作、单元格拆分合并、冻结窗口、图表绘制等)【三】
python入门之后须掌握的知识点(模块化编程、时间模块)【一】
python入门之后须掌握的知识点(excel文件处理+邮件发送+实战:批量化发工资条)【二】
码源:
- from openpyxl import Workbook
- # 实例例化
- wb = Workbook()
- # 获取当前active的sheet
- ws = wb.active
- print(sheet.title) # 打印sheet表名
- sheet.title = "salary luffy" # 改sheet 名
打开已有文件:
- >>> from openpyxl import load_workbook
- >>> wb2 = load_workbook('⽂文件名称.xlsx')
写入数据
- # ⽅方式⼀一:数据可以直接分配到单元格中(可以输⼊入公式)
- sheet["C5"] = "Hello ⾦金金⻆角⼤大王"
- sheet["C7"] = "Hello ⾦金金⻆角⼤大王2"
- # ⽅方式⼆二:可以附加⾏行行,从第⼀一列列开始附加(从最下⽅方空⽩白处,最左开始)(可以输⼊入多⾏行行)
- sheet.append([1, 2, 3])
- # ⽅方式三: Python 类型会被⾃自动转换
- sheet['A3'] = datetime.datetime.now().strftime("%Y-%m-%d")
选择表
- # sheet 名称可以作为 key 进⾏行行索引
- ws3 = wb["New Title"]
- ws4 = wb.get_sheet_by_name("New Title")
- print(wb.get_sheet_names()) # 打印所有的sheet
- sheet = wb.worksheets[0] # 获得第1个sheet
保存表
wb.save('⽂文件名称.xlsx')
按行遍历
- for row in sheet: # 循环获取表数据
- for cell in row: # 循环获取每个单元格数据
- print(cell.value, end=",")
- print()
按列遍历
- # A1, A2, A3这样的顺序
- for column in sheet.columns:
- for cell in column:
- print(cell.value,end=",")
- print()
遍历指定行&列
- # 从第2⾏开始⾄至第5行,每行打印5列
- for row in sheet.iter_rows(min_row=2,max_row=5,max_col=5):
- for cell in row:
- print(cell.value,end=",")
- print()
遍历指定⼏列的数据
取得第2-第5列的数据
- for col in sheet.iter_cols(min_col=2,max_col=5,):
- for i in col:
- print(i.value,end=",")
- print()
删除工作表
- # 方式⼀
- wb.remove(sheet)
- # 方式⼆
- del wb[sheet]
需导入的类
from openpyxl.styles import Font, colors, Alignment
二、字体
下⾯面的代码指定了了等线24号,加粗斜体,字体颜⾊色红⾊色。直接使⽤用cell的font属性,将Font对象赋值给它。
- bold_itatic_24_font = Font(name='等线', size=24, italic=True, color=colors.RED,
- bold=True) # 声明样式
- sheet['A1'].font = bold_itatic_24_font # 给单元格设置样式
三、对⻬方式
也是直接使⽤用cell的属性aligment,这⾥里里指定垂直居中和⽔水平居中。除了了center,还可以使⽤用right、 left等参数。
- # 设置B1中的数据垂直居中和⽔水平居中
- sheet['B1'].alignment = Alignment(horizontal='center', vertical='center')
设置行高&列宽
- # 第2⾏高
- sheet.row_dimensions[2].height = 40
- # C列列列列宽
- sheet.column_dimensions['C'].width = 30
想实现发送邮件需经过以下几步:
1. 登录 邮件服务器器
2. 构造符合邮件协议规则要求的邮件内容 (email模块)
3. 发送
Python对SMTP⽀支持有 smtplib 和 email 两个模块, email 负责构造邮件, smtplib 负责发送邮件,它对smtp协议进⾏行行了了简单的封装。。
- import smtplib
- from email.mime.text import MIMEText # 邮件正⽂文
- from email.header import Header # 邮件头
- # 登录邮件服务器器
- smtp_obj = smtplib.SMTP_SSL("smtp.qq.com", 465) # 发件⼈人邮箱中的SMTP服务器,端⼝口是25
- smtp_obj.login("xxxx@qq.com", "密码") # 括号中对应的是发件⼈人邮箱账号、邮箱密码
- #smtp_obj.set_debuglevel(1) # 显示调试信息
- # 设置邮件头信息
- msg = MIMEText("Hello, ", "plain", "utf-8") #plain文本格式
- msg["From"] = Header("来⾃自娜美的问候","utf-8") # 发送者
- msg["To"] = Header("有缘⼈人","utf-8") # 接收者
- msg["Subject"] = Header("娜美的信","utf-8") # 主题
- # 发送
- smtp_obj.sendmail("xxxxx@qq.com", ["7894565595@qq.com","1234565595@qq.com"], msg.as_string())
- print(f"成功发送到")
个人QQ号申请ssl设置如下:
得到授权码填写一下即可
只需要改一下 MIMEText() 第2个参数为 html 就可以
- # 设置邮件头信息
- mail_body = '''
- <h5>hello,⼩</h5>
- <p>
- hello.. <a
- href="http://wx1.sinaimg.cn/mw1024/5ff6135fgy1gdnghz2vbsg205k09ob2d.gif">这是我
- 的照⽚片</a></p>
- </p>
- '''
- msg = MIMEText(mail_body, "html", "utf-8")
下面是企业qq下发送
- import smtplib
- from email.mime.image import MIMEImage
- from email.mime.multipart import MIMEMultipart
- from email.mime.text import MIMEText
- from email.header import Header
- # 登录邮件服务器器
- smtp_obj = smtplib.SMTP_SSL("smtp.exmail.qq.com", 465) # 发件⼈人邮箱中的SMTP服务
- 器器,端⼝口是25
- smtp_obj.login("nami@luffycity.com", "333dsfsf#$#") # 括号中对应的是发件⼈人邮箱账
- 号、邮箱密码
- smtp_obj.set_debuglevel(1) # 显示调试信息
- # 设置邮件头信息
- mail_body = '''
- <h5>hello,⼩小哥哥</h5>
- <p>
- hello..
- <p><img src="cid:image1"></p>
- </p>
- '''
- msg_root = MIMEMultipart('related') # 允许添加附件、图⽚片等
- msg_root["From"] = Header("来⾃自娜美的问候","utf-8") # 发送者
- msg_root["To"] = Header("有缘⼈人","utf-8") # 接收者
- msg_root["Subject"] = Header("娜美的信","utf-8") # 主题
- # 允许添加图⽚片
- msgAlternative = MIMEMultipart('alternative')
- msgAlternative.attach(MIMEText(mail_body, 'html', 'utf-8'))
- msg_root.attach(msgAlternative) # 把邮件正⽂文内容添加到msg_root⾥里里
- # 加载图⽚片,
- fp = open('girl.jpg', 'rb')
- msgImage = MIMEImage(fp.read())
- fp.close()
- # 定义图⽚片 ID,在 HTML ⽂文本中引⽤用
- msgImage.add_header('Content-ID', '<image1>')
- msg_root.attach(msgImage) # 添加图⽚片到msg_root对象⾥里里
- # 发送
- smtp_obj.sendmail("nami@luffycity.com", ["alex@luffycity.com",
- "317828332@qq.com"], msg_root.as_string())
更多Python3 SMTP发送邮件参考下面链接:
先上简易版的
- from openpyxl import load_workbook
- import smtplib
- from email.mime.text import MIMEText # 邮件正⽂文
- from email.header import Header # 邮件头
- #加载excel文件
- wb = load_workbook ("工资.xlsx")
- sheet = wb.active
-
- # 登录邮件服务器器
-
- smtp_obj = smtplib.SMTP_SSL("smtp.qq.com", 465) # 发件⼈人邮箱中的SMTP服务器,端⼝口是25
- smtp_obj.login("8xxx@qq.com", "xxx") # 括号中对应的是发件⼈人邮箱账号、邮箱密码
-
- #循环excel
- for row in sheet.iter_rows(min_row=2,max_row=3):
- row_text=""
- for cell in row:
- # print(cell.value,end=",")
- row_text+=f"{cell.value}"
- name = row[2]
- staff_email=row[1].value
- print(staff_email,name.value)
-
-
- mail_body = '''
- <h3>{name.value} ,你好:</h3>
- <p>请查收你2022-05月的工资条
- {row_text}
- </p>|
- '''
- msg = MIMEText(mail_body,"html", "utf-8") #plain文本格式
- msg["From"] = Header("人事部","utf-8") # 发送者
- msg["To"] = Header("员工","utf-8") # 接收者
- msg["Subject"] = Header("工资条","utf-8") # 主题
- smtp_obj.sendmail("xxxxx5@qq.com", [staff_email,], msg.as_string())
- print(f"成功发送到{staff_email} to {name.value}.")
其次是生成格式:
- <!DOCTYPE html>
- <html>
- <head>
- <meta charset="utf-8">
- <title>test</title>
- </head>
- <body>
- <table border=" 1px solid black">
- <tr>
- <td>name</td>
- <td>age</td>
- <td>sex</td>
- </tr>
- <tr>
- <td>ming</td>
- <td>22</td>
- <td>男</td>
- </tr>
- <!-- <h1>我的第一个标题</h1>
- <p>我的第一个段落。</p> -->
- </table>
- </body>
- </html>
将html格式写入python文件中:
- from openpyxl import load_workbook
- import smtplib
- from email.mime.text import MIMEText # 邮件正⽂文
- from email.header import Header # 邮件头
- #加载excel文件
- wb = load_workbook ("工资.xlsx")
- sheet = wb.active
-
- # 登录邮件服务器器
-
- smtp_obj = smtplib.SMTP_SSL("smtp.qq.com", 465) # 发件⼈人邮箱中的SMTP服务器,端⼝口是25
- smtp_obj.login("8xxxxx75@qq.com", "xxxxxbgg") # 括号中对应的是发件⼈人邮箱账号、邮箱密码
-
- #循环excel
- for row in sheet.iter_rows(min_row=2,max_row=2):
- row_text="<tr>"
- for cell in row:
- # print(cell.value,end=",")
- row_text+=f"<td>{cell.value}</td>"
- row_text+="</tr>"
- name = row[2]
- staff_email=row[1].value
- print(staff_email,name.value)
-
-
- mail_body= '''
- <h3> {name.value},你好: </h3>
- <p>请查收你2022-05月的工资条 </p>
- <table border="1px solid black">
- {row_text}
- </table>
- '''
- print(mail_body)
- msg = MIMEText(mail_body,"html", "utf-8") #plain文本格式
- msg["From"] = Header("人事部","utf-8") # 发送者
- msg["To"] = Header("员工","utf-8") # 接收者
- msg["Subject"] = Header("工资条","utf-8") # 主题
- smtp_obj.sendmail("8xxxx5@qq.com", [staff_email], msg.as_string())
- print(f"成功发送到{staff_email} to {name.value}.")
但是会发现一个问题:只会把公式读取过来,没有读数据
wb = load_workbook ("工资.xlsx",data_only=True)
修改成上面即可
下面保存表头
- from openpyxl import load_workbook
- import openpyxl
- import smtplib
- from email.mime.text import MIMEText # 邮件正⽂文
- from email.header import Header # 邮件头
- #加载excel文件
- wb = load_workbook ("工资.xlsx",data_only=True)
- sheet = wb.active
-
- # 登录邮件服务器器
-
- smtp_obj = smtplib.SMTP_SSL("smtp.qq.com", 465) # 发件⼈人邮箱中的SMTP服务器,端⼝口是25
- smtp_obj.login("xxx@qq.com", "xxx") # 括号中对应的是发件⼈人邮箱账号、邮箱密码
-
- count=0
- table_col_html="<thead>"
-
- #循环excel
- for row in sheet.iter_rows(min_row=1,max_row=2):
- count+=1
- if count==1:
- for col in row:
- table_col_html+="<th>{col.value}</th>"
- table_col_html+="</thead>"
- continue
- else:
- row_text="<tr>"
- for cell in row:
- # print(cell.value,end=",")
- row_text+=f"<td>{cell.value}</td>"
- row_text+="</tr>"
- name = row[2]
- staff_email=row[1].value
- print(staff_email,name.value)
-
-
- mail_body= '''
- <h3> {name.value},你好: </h3>
- <p>请查收你2022-05月的工资条 </p>
- <table border="1px solid black">
- {table_col_html}
- {row_text}
- </table>
- '''
- print(mail_body)
- msg = MIMEText(mail_body,"html", "utf-8") #plain文本格式
- msg["From"] = Header("人事部","utf-8") # 发送者
- msg["To"] = Header("员工","utf-8") # 接收者
- msg["Subject"] = Header("工资条","utf-8") # 主题
- smtp_obj.sendmail("8xxxxm", [staff_email], msg.as_string())
- print(f"成功发送到{staff_email} to {name.value}.")
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。