You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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邮件的正文内容,未来计划实现无人干预的每日报表自动化,但目前在格式设置上遇到以下问题:

  1. 如何直接将Dataframe导入邮件正文?是否必须通过Excel中转?
  2. 确保所有列标题完整显示,目前经Excel中转时部分标题被隐藏,需手动调整才能查看完整标题;
  3. 为“value 2”(注:原问题提及的“TCE value”对应此处列名)列添加千位分隔符,同时去除该列多余的.0后缀;
  4. 为“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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 07:15:38