相关文章:

python处理Excel实现自动化办公教学(含实战)【一】

python处理Excel实现自动化办公教学(含实战)【二】

python处理Excel实现自动化办公教学(数据筛选、公式操作、单元格拆分合并、冻结窗口、图表绘制等)【三】

python入门之后须掌握的知识点(模块化编程、时间模块)【一】

python入门之后须掌握的知识点(excel文件处理+邮件发送+实战:批量化发工资条)【二】


码源:

发邮件处理码源excel.zip-机器学习文档类资源-CSDN下载

1.excel处理

1.1 创建文件

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')

1.2 遍历表数据

按行遍历

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]

1.3设置单元格样式

需导入的类

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

2.发送邮件smtplib

想实现发送邮件需经过以下几步:
1. 登录 邮件服务器器
2. 构造符合邮件协议规则要求的邮件内容 (email模块)
3. 发送
Python对SMTP⽀支持有 smtplib 和 email 两个模块, email 负责构造邮件, smtplib 负责发送邮件,它对smtp协议进⾏行行了了简单的封装。。

2.1 发送一封最简单的信语法如下:

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设置如下:

得到授权码填写一下即可

2.2 发送HTML格式的邮件

只需要改一下 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")

2.3 在HTML⽂文本中插⼊入图⽚

下面是企业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发送邮件参考下面链接:

Python3 SMTP发送邮件 | 菜鸟教程Python3 SMTP发送邮件 SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。 python的smtplib提供了一种很方便的途径发送电子邮件。它对smtp协议进行了简单的封装。 Python创建 SMTP 对象语法如下: import smtplib smtpObj = smtplib.SMTP( [host [..https://www.runoob.com/python3/python3-smtp.html

3.实战批量化发工资条

先上简易版的

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}.")

python入门之后须掌握的知识点(excel文件处理+邮件发送+实战:批量化发工资条)【二】的更多相关文章

  1. python第三方库——xlrd和xlwt操作Excel文件学习

    python第三方库——xlrd和xlwt操作Excel文件学习 1安装: C:\Users\Lenovo>pip install xlwtCollecting xlwt  Downloadin ...

  2. Python xlrd、xlwt、xlutils修改Excel文件

    一.xlrd读取excel 这里介绍一个不错的包xlrs,可以工作在任何平台.这也就意味着你可以在Linux下读取Excel文件.首先,打开workbook:    import xlrdwb = x ...

  3. Python xlrd、xlwt、xlutils修改Excel文件-OK

    一.xlrd读取excel 这里介绍一个不错的包xlrs,可以工作在任何平台.这也就意味着你可以在Linux下读取Excel文件. 首先,打开workbook:    import xlrdwb = ...

  4. python 利用三方的xlrd模块读取excel文件,处理合并单元格

      目的: python能使用xlrd模块实现对Excel数据的读取,且按照想要的输出形式.  总体思路: (1)要想实现对Excel数据的读取,需要用到第三方应用,直接应用. (2)实际操作时候和我 ...

  5. 用Python的导入csv、文本文件、Excel文件的数据

    使用read_csv函数导入CSV文件 read.csv函数语法 read_csv(file,encoding) 例子: Age,Name 22,wangwei 23,lixin 24,liqing ...

  6. python常识系列07-->python利用xlwt写入excel文件

    前言 读书之法,在循序而渐进,熟读而精思.--朱熹 抽空又来写一篇,毕竟知识在于分享! 一.xlwt模块是什么 python第三方工具包,用于往excel中写入数据:(ps:只能创建新表格,不能修改表 ...

  7. python入门(四):标准输出和文件读写

    Python输出 1.表达式语句 str(): 函数返回一个用户易读的表达形式,可以使用 str.format() 函数来格式化输出值. repr(): 产生一个解释器易读的表达形式. 2.print ...

  8. 使用Python处理Excel文件的一些代码示例

    笔记:使用Python处理Excel文件的一些代码示例,以下代码来自于<Python数据分析基础>一书,有删改 #!/usr/bin/env python3 # 导入读取Excel文件的库 ...

  9. 第15.25节 PyQt(Python+Qt)入门学习:Model/View开发实战--使用QTableView展示Excel文件内容

    老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 一.概述 在前面的订阅专栏<第十九章.Model/View开发:QTableView的功能及属 ...

  10. 核心知识点:python入门

    目录 一.python入门day1-day24 day01-03 编程语言 day04 变量 day05 垃圾回收机制(GC机制) 1 引用计数 2 标记清除 3 分代回收 day05 程序交互与基本 ...

随机推荐

  1. Java 四种引用类型(强引用、软引用、弱引用、虚引用)

    概述 Java 中的引用类似 C 语言中的指针,指向一个对象,比如: // person 就是指向 Person 实例"张三"的引用 Person person = new Per ...

  2. NOKOV度量光学动作捕捉系统工作流程

    如果你对影视.动画或者游戏有一定关注,相信你一定听说过"动作捕捉".事实上,无论是屏幕中的战场,还是真实的军事领域,从2K游戏中的虚拟球员,到医疗.康复.运动领域的专业研究:从机器 ...

  3. 白嫖:GPT-4

    众所周知,GPT-4需要充OpenAI 的 Plus才能使用,Plus则需要每月20美金. 很多同学很想体验GPT-4,但一方面不想花钱,一方面想花也没那么容易花出去(懂的都懂) 我看到有人分享可以免 ...

  4. KB21N、KB24N作业分配与冲销

    一.KB21N 调用BAPI:BAPI_ACC_ACTIVITY_ALLOC_POST 经测试,分配订单时行项目一次性最多传332条数据 "------------------------- ...

  5. 自用 | Rust 基础学习资料

    Rust语言圣经:Github,GitBook Rustt,RusttT 翻译小组的官方仓库,这里有国外优秀的技术文章.学习教程.新闻资讯的高质量翻译. Rust语言周刊,每周五发布,精选过去一周的技 ...

  6. 20级训练赛Round #5

    A - 凯少与素数 签到 & 思维题, 要使每一对数字 \((i,j)\) 的最大公约数都等于 1,简单来说区间相邻的两个数一定 \(gcd(i,j) = 1\) 并且 \((r - l)\) ...

  7. 无向图求桥 UVA 796

    ***桥的概念:无向连通图中,如果删除某边后,图变 成不连通,则称该边为桥.*** ***一条边(u,v)是桥,当且仅当(u,v)为树枝边,且 满足dfn(u)<low(v)(前提是其没有重边) ...

  8. Listener refused the connection with the following error: ORA-12514

    1.问题 在使用Oracle SQL Developer时,遇到以下问题: 状态: 失败 -测试失败: Listener refused the connection with the followi ...

  9. Oracle实例的启动和关闭

    启动模式 1.NoMount 模式(启动实例不加载数据库) 命令:startup nomount 讲解:这种启动模式只会创建实例,并不加载数据库,Oracle仅为实例创建各种内存结构和服务进程,不会打 ...

  10. Java21 + SpringBoot3整合Redis,使用Lettuce连接池,推荐连接池参数配置,封装Redis操作

    目录 前言 相关技术简介 Redis 实现步骤 引入maven依赖 修改配置文件 定义Redis配置类 定义Redis服务类,封装Redis常用操作 使用Redis服务类 总结 前言 近日心血来潮想做 ...