当前位置:   article > 正文

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

python3读取excle自动发工资条

相关文章:

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

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

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

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

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


码源:

发邮件处理码源excel.zip-机器学习文档类资源-CSDN下载发邮件处理码源excel.zip更多下载资源、学习资料请访问CSDN下载频道.https://download.csdn.net/download/sinat_39620217/85202110

1.excel处理

1.1 创建文件

  1. from openpyxl import Workbook
  2. # 实例例化
  3. wb = Workbook()
  4. # 获取当前active的sheet
  5. ws = wb.active
  6. print(sheet.title) # 打印sheet表名
  7. sheet.title = "salary luffy" # 改sheet 名

打开已有文件:

  1. >>> from openpyxl import load_workbook
  2. >>> wb2 = load_workbook('⽂文件名称.xlsx')

写入数据

  1. # ⽅方式⼀一:数据可以直接分配到单元格中(可以输⼊入公式)
  2. sheet["C5"] = "Hello ⾦金金⻆角⼤大王"
  3. sheet["C7"] = "Hello ⾦金金⻆角⼤大王2"
  4. # ⽅方式⼆二:可以附加⾏行行,从第⼀一列列开始附加(从最下⽅方空⽩白处,最左开始)(可以输⼊入多⾏行行)
  5. sheet.append([1, 2, 3])
  6. # ⽅方式三: Python 类型会被⾃自动转换
  7. sheet['A3'] = datetime.datetime.now().strftime("%Y-%m-%d")

选择表

  1. # sheet 名称可以作为 key 进⾏行行索引
  2. ws3 = wb["New Title"]
  3. ws4 = wb.get_sheet_by_name("New Title")
  4. print(wb.get_sheet_names()) # 打印所有的sheet
  5. sheet = wb.worksheets[0] # 获得第1个sheet

 保存表

wb.save('⽂文件名称.xlsx')

 1.2 遍历表数据

按行遍历

  1. for row in sheet: # 循环获取表数据
  2. for cell in row: # 循环获取每个单元格数据
  3. print(cell.value, end=",")
  4. print()

按列遍历

  1. # A1, A2, A3这样的顺序
  2. for column in sheet.columns:
  3. for cell in column:
  4. print(cell.value,end=",")
  5. print()

遍历指定行&列

  1. # 从第2⾏开始⾄至第5行,每行打印5列
  2. for row in sheet.iter_rows(min_row=2,max_row=5,max_col=5):
  3. for cell in row:
  4. print(cell.value,end=",")
  5. print()

遍历指定⼏列的数据
取得第2-第5列的数据

  1. for col in sheet.iter_cols(min_col=2,max_col=5,):
  2. for i in col:
  3. print(i.value,end=",")
  4. print()

删除工作表

  1. # 方式⼀
  2. wb.remove(sheet)
  3. # 方式⼆
  4. del wb[sheet]

1.3设置单元格样式

需导入的类

from openpyxl.styles import Font, colors, Alignment

二、字体
下⾯面的代码指定了了等线24号,加粗斜体,字体颜⾊色红⾊色。直接使⽤用cell的font属性,将Font对象赋值给它。

  1. bold_itatic_24_font = Font(name='等线', size=24, italic=True, color=colors.RED,
  2. bold=True) # 声明样式
  3. sheet['A1'].font = bold_itatic_24_font # 给单元格设置样式

三、对⻬方式
也是直接使⽤用cell的属性aligment,这⾥里里指定垂直居中和⽔水平居中。除了了center,还可以使⽤用right、 left等参数。

  1. # 设置B1中的数据垂直居中和⽔水平居中
  2. sheet['B1'].alignment = Alignment(horizontal='center', vertical='center')

设置行高&列宽

  1. # 第2⾏高
  2. sheet.row_dimensions[2].height = 40
  3. # C列列列列宽
  4. sheet.column_dimensions['C'].width = 30

2.发送邮件smtplib

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

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

  1. import smtplib
  2. from email.mime.text import MIMEText # 邮件正⽂文
  3. from email.header import Header # 邮件头
  4. # 登录邮件服务器器
  5. smtp_obj = smtplib.SMTP_SSL("smtp.qq.com", 465) # 发件⼈人邮箱中的SMTP服务器,端⼝口是25
  6. smtp_obj.login("xxxx@qq.com", "密码") # 括号中对应的是发件⼈人邮箱账号、邮箱密码
  7. #smtp_obj.set_debuglevel(1) # 显示调试信息
  8. # 设置邮件头信息
  9. msg = MIMEText("Hello, ", "plain", "utf-8") #plain文本格式
  10. msg["From"] = Header("来⾃自娜美的问候","utf-8") # 发送者
  11. msg["To"] = Header("有缘⼈人","utf-8") # 接收者
  12. msg["Subject"] = Header("娜美的信","utf-8") # 主题
  13. # 发送
  14. smtp_obj.sendmail("xxxxx@qq.com", ["7894565595@qq.com","1234565595@qq.com"], msg.as_string())
  15. print(f"成功发送到")

个人QQ号申请ssl设置如下:

 得到授权码填写一下即可

2.2 发送HTML格式的邮件

只需要改一下 MIMEText() 第2个参数为 html 就可以

  1. # 设置邮件头信息
  2. mail_body = '''
  3. <h5>hello,⼩</h5>
  4. <p>
  5. hello.. <a
  6. href="http://wx1.sinaimg.cn/mw1024/5ff6135fgy1gdnghz2vbsg205k09ob2d.gif">这是我
  7. 的照⽚片</a></p>
  8. </p>
  9. '''
  10. msg = MIMEText(mail_body, "html", "utf-8")

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

下面是企业qq下发送

  1. import smtplib
  2. from email.mime.image import MIMEImage
  3. from email.mime.multipart import MIMEMultipart
  4. from email.mime.text import MIMEText
  5. from email.header import Header
  6. # 登录邮件服务器器
  7. smtp_obj = smtplib.SMTP_SSL("smtp.exmail.qq.com", 465) # 发件⼈人邮箱中的SMTP服务
  8. 器器,端⼝口是25
  9. smtp_obj.login("nami@luffycity.com", "333dsfsf#$#") # 括号中对应的是发件⼈人邮箱账
  10. 号、邮箱密码
  11. smtp_obj.set_debuglevel(1) # 显示调试信息
  12. # 设置邮件头信息
  13. mail_body = '''
  14. <h5>hello,⼩小哥哥</h5>
  15. <p>
  16. hello..
  17. <p><img src="cid:image1"></p>
  18. </p>
  19. '''
  20. msg_root = MIMEMultipart('related') # 允许添加附件、图⽚片等
  21. msg_root["From"] = Header("来⾃自娜美的问候","utf-8") # 发送者
  22. msg_root["To"] = Header("有缘⼈人","utf-8") # 接收者
  23. msg_root["Subject"] = Header("娜美的信","utf-8") # 主题
  24. # 允许添加图⽚片
  25. msgAlternative = MIMEMultipart('alternative')
  26. msgAlternative.attach(MIMEText(mail_body, 'html', 'utf-8'))
  27. msg_root.attach(msgAlternative) # 把邮件正⽂文内容添加到msg_root⾥里里
  28. # 加载图⽚片,
  29. fp = open('girl.jpg', 'rb')
  30. msgImage = MIMEImage(fp.read())
  31. fp.close()
  32. # 定义图⽚片 ID,在 HTML ⽂文本中引⽤用
  33. msgImage.add_header('Content-ID', '<image1>')
  34. msg_root.attach(msgImage) # 添加图⽚片到msg_root对象⾥里里
  35. # 发送
  36. smtp_obj.sendmail("nami@luffycity.com", ["alex@luffycity.com",
  37. "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.实战批量化发工资条

先上简易版的

  1. from openpyxl import load_workbook
  2. import smtplib
  3. from email.mime.text import MIMEText # 邮件正⽂文
  4. from email.header import Header # 邮件头
  5. #加载excel文件
  6. wb = load_workbook ("工资.xlsx")
  7. sheet = wb.active
  8. # 登录邮件服务器器
  9. smtp_obj = smtplib.SMTP_SSL("smtp.qq.com", 465) # 发件⼈人邮箱中的SMTP服务器,端⼝口是25
  10. smtp_obj.login("8xxx@qq.com", "xxx") # 括号中对应的是发件⼈人邮箱账号、邮箱密码
  11. #循环excel
  12. for row in sheet.iter_rows(min_row=2,max_row=3):
  13. row_text=""
  14. for cell in row:
  15. # print(cell.value,end=",")
  16. row_text+=f"{cell.value}"
  17. name = row[2]
  18. staff_email=row[1].value
  19. print(staff_email,name.value)
  20. mail_body = '''
  21. <h3>{name.value} ,你好:</h3>
  22. <p>请查收你2022-05月的工资条
  23. {row_text}
  24. </p>|
  25. '''
  26. msg = MIMEText(mail_body,"html", "utf-8") #plain文本格式
  27. msg["From"] = Header("人事部","utf-8") # 发送者
  28. msg["To"] = Header("员工","utf-8") # 接收者
  29. msg["Subject"] = Header("工资条","utf-8") # 主题
  30. smtp_obj.sendmail("xxxxx5@qq.com", [staff_email,], msg.as_string())
  31. print(f"成功发送到{staff_email} to {name.value}.")

其次是生成格式:

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8">
  5. <title>test</title>
  6. </head>
  7. <body>
  8. <table border=" 1px solid black">
  9. <tr>
  10. <td>name</td>
  11. <td>age</td>
  12. <td>sex</td>
  13. </tr>
  14. <tr>
  15. <td>ming</td>
  16. <td>22</td>
  17. <td></td>
  18. </tr>
  19. <!-- <h1>我的第一个标题</h1>
  20. <p>我的第一个段落。</p> -->
  21. </table>
  22. </body>
  23. </html>

 将html格式写入python文件中:

  1. from openpyxl import load_workbook
  2. import smtplib
  3. from email.mime.text import MIMEText # 邮件正⽂文
  4. from email.header import Header # 邮件头
  5. #加载excel文件
  6. wb = load_workbook ("工资.xlsx")
  7. sheet = wb.active
  8. # 登录邮件服务器器
  9. smtp_obj = smtplib.SMTP_SSL("smtp.qq.com", 465) # 发件⼈人邮箱中的SMTP服务器,端⼝口是25
  10. smtp_obj.login("8xxxxx75@qq.com", "xxxxxbgg") # 括号中对应的是发件⼈人邮箱账号、邮箱密码
  11. #循环excel
  12. for row in sheet.iter_rows(min_row=2,max_row=2):
  13. row_text="<tr>"
  14. for cell in row:
  15. # print(cell.value,end=",")
  16. row_text+=f"<td>{cell.value}</td>"
  17. row_text+="</tr>"
  18. name = row[2]
  19. staff_email=row[1].value
  20. print(staff_email,name.value)
  21. mail_body= '''
  22. <h3> {name.value},你好: </h3>
  23. <p>请查收你2022-05月的工资条 </p>
  24. <table border="1px solid black">
  25. {row_text}
  26. </table>
  27. '''
  28. print(mail_body)
  29. msg = MIMEText(mail_body,"html", "utf-8") #plain文本格式
  30. msg["From"] = Header("人事部","utf-8") # 发送者
  31. msg["To"] = Header("员工","utf-8") # 接收者
  32. msg["Subject"] = Header("工资条","utf-8") # 主题
  33. smtp_obj.sendmail("8xxxx5@qq.com", [staff_email], msg.as_string())
  34. print(f"成功发送到{staff_email} to {name.value}.")

 但是会发现一个问题:只会把公式读取过来,没有读数据

wb = load_workbook ("工资.xlsx",data_only=True)

修改成上面即可

 下面保存表头

  1. from openpyxl import load_workbook
  2. import openpyxl
  3. import smtplib
  4. from email.mime.text import MIMEText # 邮件正⽂文
  5. from email.header import Header # 邮件头
  6. #加载excel文件
  7. wb = load_workbook ("工资.xlsx",data_only=True)
  8. sheet = wb.active
  9. # 登录邮件服务器器
  10. smtp_obj = smtplib.SMTP_SSL("smtp.qq.com", 465) # 发件⼈人邮箱中的SMTP服务器,端⼝口是25
  11. smtp_obj.login("xxx@qq.com", "xxx") # 括号中对应的是发件⼈人邮箱账号、邮箱密码
  12. count=0
  13. table_col_html="<thead>"
  14. #循环excel
  15. for row in sheet.iter_rows(min_row=1,max_row=2):
  16. count+=1
  17. if count==1:
  18. for col in row:
  19. table_col_html+="<th>{col.value}</th>"
  20. table_col_html+="</thead>"
  21. continue
  22. else:
  23. row_text="<tr>"
  24. for cell in row:
  25. # print(cell.value,end=",")
  26. row_text+=f"<td>{cell.value}</td>"
  27. row_text+="</tr>"
  28. name = row[2]
  29. staff_email=row[1].value
  30. print(staff_email,name.value)
  31. mail_body= '''
  32. <h3> {name.value},你好: </h3>
  33. <p>请查收你2022-05月的工资条 </p>
  34. <table border="1px solid black">
  35. {table_col_html}
  36. {row_text}
  37. </table>
  38. '''
  39. print(mail_body)
  40. msg = MIMEText(mail_body,"html", "utf-8") #plain文本格式
  41. msg["From"] = Header("人事部","utf-8") # 发送者
  42. msg["To"] = Header("员工","utf-8") # 接收者
  43. msg["Subject"] = Header("工资条","utf-8") # 主题
  44. smtp_obj.sendmail("8xxxxm", [staff_email], msg.as_string())
  45. print(f"成功发送到{staff_email} to {name.value}.")

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/432517
推荐阅读
相关标签
  

闽ICP备14008679号