在电子邮件正文中发送样式化的数据框

时间:2019-11-19 16:24:10

标签: python css pandas dataframe

我在下面有此功能,它使我的数据框带有边框和一些突出显示。但是,因为我使用过.style,所以我无法使用.to_html()将数据帧放入电子邮件中,因此我使用.render()。但是,当我使用render()时,边框格式会稍有变化。下面是我想要的Python图片,以及电子邮件中的图片。知道如何在保留格式的同时将样式化的数据框放入电子邮件正文吗?

import win32com.client
import numpy as np
import pandas as pd
import datetime as dt
import time
import os

curr_date = dt.datetime.now().strftime("%Y%m%d")
csv = pd.read_csv("Pipeline_Signals_" + curr_date + ".csv", delimiter = ',')
df = pd.DataFrame(csv)
df = df1.replace(np.nan, '', regex=True)

def _color_red_or_green(val):
    color = 'red' if "*" in val else 'white'
    return 'background-color: %s' % color

df = (df.style
    .applymap(_color_red_or_green) 
    .set_table_styles([{'selector': 'th', 'props': [('border-color', 'black'),('background-color', 'white'), ('border-style','solid')]}])
    .hide_index() 
    .set_properties(**{'color': 'black',
                       'border-style' :'solid',
                       'border-color': 'black'}))

df1 = df.render()

import win32com.client

inbox = win32com.client.gencache.EnsureDispatch("Outlook.Application").GetNamespace("MAPI")
inbox = win32com.client.Dispatch("Outlook.Application")

mail = inbox.CreateItem(0x0)
mail.To = "test@test.co.uk"
mail.CC = "test@test.co.uk"
mail.Subject = "Test Signals " + curr_date

mail.HTMLBody = df1

mail.Display()

这是Python中数据框的外观以及我希望它的外观

enter image description here

这是将数据框放入电子邮件正文时的数据框外观。由于某些原因,边界会改变。

enter image description here

1 个答案:

答案 0 :(得分:0)

它似乎来自显示表时默认使用的CSS表。设置样式时,应尝试将表的CSS“ border-collapse”属性设置为“ collapse”。如果不起作用,请尝试将“边框间距”属性设置为0。