如何将Dataframe转为Outlook邮件正文并实现指定格式设置?
问题描述
我有如下Dataframe:
date value value 2 daily value change shortCode TD1 2023-01-06 38.67 15162.0 -1.00 TD2 2023-01-06 53.42 33952.0 -0.40 TD3C 2023-01-06 52.91 30486.0 -0.36 TD6 2023-01-06 169.61 90824.0 -3.83 TD7 2023-01-06 168.56 66685.0 -1.25 TD8 2023-01-06 244.29 71413.0 -2.42 TD9 2023-01-06 129.38 24498.0 -2.50 TD14 2023-01-06 251.19 81252.0 -0.81 TD15 2023-01-06 54.03 32382.0 -0.56 TD18 2023-01-06 425.08 71615.0 -2.42
我希望将其作为Outlook邮件的正文内容,未来计划实现无人干预的每日报表自动化,但目前在格式设置上遇到以下问题:
- 如何直接将Dataframe导入邮件正文?是否必须通过Excel中转?
- 确保所有列标题完整显示,目前经Excel中转时部分标题被隐藏,需手动调整才能查看完整标题;
- 为“value 2”(注:原问题提及的“TCE value”对应此处列名)列添加千位分隔符,同时去除该列多余的.0后缀;
- 为“daily value change”等列设置颜色格式:正数显示为绿色,负数显示为红色。
我尝试实现千位分隔符的代码如下:
df_bdti_final[['value', 'TCE value', ]] = df_bdti_final[['value', 'TCE value']].iloc[:, :].applymap('{:,}'.format)
解决方案
1. 直接导入DataFrame到Outlook邮件正文(无需Excel中转)
可以将DataFrame转换为HTML格式,通过win32com.client调用Outlook API插入到邮件正文中,全程无需Excel中转。示例代码:
import win32com.client as win32 import pandas as pd # 假设你的数据存储在df变量中 html_table = df.to_html(classes='table', index=True) # 初始化Outlook客户端 outlook = win32.Dispatch('outlook.application') mail = outlook.CreateItem(0) mail.Subject = "每日报表" # 将HTML表格作为邮件正文 mail.HTMLBody = f"<html><body>{html_table}</body></html>" # 按需执行发送或保存操作 # mail.Send() # mail.Save()
2. 确保列标题完整显示
使用to_html生成表格时默认保留完整列名,若渲染时出现截断,可添加自定义CSS样式强制标题不换行、列宽自适应:
# 自定义HTML样式 style = """ <style> table {width: 100%; border-collapse: collapse;} th, td {border: 1px solid #ddd; padding: 8px; text-align: left;} th {background-color: #f2f2f2; white-space: nowrap;} </style> """ html_table = df.to_html(classes='table', index=True) full_html = f"<html><head>{style}</head><body>{html_table}</body></html>" # 将full_html赋值给mail.HTMLBody即可
3. 处理“value 2”列的千位分隔符与.0后缀
.0后缀是因为该列数据类型为float,先转为整数再添加千位分隔符即可解决。有两种实现方式:
- 直接修改原DataFrame列:
# 转为整数去除.0,再格式化添加千位分隔符 df['value 2'] = df['value 2'].astype(int).apply(lambda x: f"{x:,}")
- 生成HTML时临时格式化,不修改原数据:
html_table = df.to_html( classes='table', index=True, formatters={ 'value 2': lambda x: f"{int(x):,}" } )
4. 为“daily value change”列设置颜色格式
利用Pandas的Styler对象生成带内联样式的HTML表格,实现正负值颜色区分:
def color_change(val): color = 'green' if val > 0 else 'red' return f'color: {color};' # 为指定列应用颜色样式 styled_df = df.style.applymap(color_change, subset=['daily value change']) # 生成带样式的HTML html_table = styled_df.to_html() # 结合之前的自定义样式使用 full_html = f"<html><head>{style}</head><body>{html_table}</body></html>"
内容的提问来源于stack exchange,提问作者neutralname
相关产品推荐
相关产品推荐

