需求

读取excel里的表格里的内容,然后打开本机的outlook。把excel里的内容添加到正文里,注意。这里是要添加到正文!正文!正文!而不是添加到附件里

设计思路

1.excel处理

打开excel的方法有很多,但是在不知道excel里,行和列的大小的情况下,就能获得excel里的非空值行列的办法不多。我这边采用的是xlwings这个库,用的方法是range.current_region这个方法。这个方法会选择当前range下,有值的区域(非空区域)

通过配置options选项,可以指定excel获得的值的格式,int或者string,或者空值返回N/A

2.打开outlook

打开outlook在windows上只能用win32模块了,通过下面方法可以打开outlook并且创建一个空的email

olook = win32com.client.Dispatch("Outlook.Application")
mail = olook.CreateItem()

然后配置邮件的htmlbody和outlook邮件悬停(可以手动更改邮件内容,手动发送),可以用以下方法

mail.HTMLBody = body_html
mail.Display(True)

完整代码

下面是完整代码,读者修改一下excel的路径,就可以自己去试试啦

# -*- coding: UTF- -*-
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
import win32com.client
import xlwings def get_excel_date(filename):
'''
获得excel里的所有内容,返回list
:param filename: excel路径
:return: list[list[]]
'''
app = xlwings.App(visible=False, add_book=True)
app.display_alerts = False
app.screen_updating = False
wb = app.books.open(filename)
sht = wb.sheets[]
rng = sht.range('A1')
# 把excel里的数据读取成 年-月-日 时:分:秒的格式
my_date_handler = lambda year, month, day, hour, minute, second, **kwargs: "%04i-%02i-%02i %02i:%02i:%02i" % (
year, month, day, hour, minute, second)
# 取出所有内容,这里用ig这个变量,是为了庆祝I.G获得LOL S8赛季总冠军
ig = rng.current_region.options(index=False, numbers=int, empty='N/A', dates=my_date_handler)
result = ig.value
wb.close()
app.quit()
return result if __name__ == '__main__':
olook = win32com.client.Dispatch("Outlook.Application")
mail = olook.CreateItem()
mail.Recipients.Add("3xxx@qq.com")
mail.Subject = "test report"
body_html = ""
body_html = body_html + '<body>Hi all:<br/>以下是XXXXX项目今天的测试情况:<br/><br/>明天的测试计划:<br/><br/>目前的bug:'
body_html = body_html + '<table width="1" border="1" cellspacing="1" cellpadding="1" height="100">'
# 这里用rng 是因为这一次rng止步8强!
rng_list = get_excel_date("D:\\reports\\Table.xlsx")
# 表头
for tr_list in rng_list[:]:
body_html = body_html + "<tr>"
for td_list in tr_list:
# 这里也是奇葩需求,因为要求表头不能换行,所以用了nowrap
body_html = body_html + '<th bgcolor="#C3C3C3" nowrap="nowrap">' + td_list + '</th>'
body_html = body_html + "</tr>"
# 表内容
for tr_list in rng_list[:]:
body_html = body_html + "<tr>"
for td_list in tr_list:
body_html = body_html + "<td>" + td_list + "</td>"
body_html = body_html + "</tr>"
body_html = body_html + '</table>'
body_html = body_html + "</body>"
mail.HTMLBody = body_html
mail.Display(True)

参考:https://www.yinyubo.cn/?p=339

最新文章

  1. Visual Studio 2015 如何将全英界面转成中文
  2. SQL Server 2014新特性探秘(3)-可更新列存储聚集索引
  3. linux 系统下开机自动启动oracle 监听和实例 (亲测有效)
  4. 【摘自网络】陈奕迅&amp;&amp;杨千嬅
  5. PHP、JSP、.NET各自的真正优势是什么
  6. 【中国剩余定理】POJ 1006 &amp; HDU 1370 Biorhythms
  7. &lt;IMG&gt;中UserMap的用法
  8. [翻译]初识SQL Server 2005 Reporting Services Part 1
  9. WinDBG调试.NET程序示例
  10. 运行ORB-SLAM笔记_编译篇(一)
  11. 线段树——习题、lazy解析
  12. 前端页面的适配使用rem换算
  13. css文本垂直居中的实现
  14. vue开发中regeneratorRuntime is not defined
  15. electron 前端开发桌面应用
  16. MYSQL 解决中文字符集乱码问题的方法
  17. mongoose的update函数中的回调函数是必须要传的吗
  18. 关于SignalR连接数量问题的记录
  19. cat命令和EOF标识输出shell到文件
  20. Git分支管理小结

热门文章

  1. 用友U8删除采购转固卡片后,再次转固找不到采购订单,且其他订单转固报错
  2. laravel学习:主从读写分离配置的实现
  3. IDEA Rider使用64位IISExpress(3)
  4. Base64和本地以及在线图片互转
  5. Zookeeper到底是什么
  6. 2019-11-29-VisualStudio-使用三个方法启动最新-C#-功能
  7. Linux系统SSH免密登录
  8. Spring IOC 复习
  9. python 学习之 基础篇三 流程控制
  10. ArrayList集合的