【问题标题】:How do I send a styled pandas DataFrame by e-mail without losing the format?如何通过电子邮件发送样式化的 pandas DataFrame 而不会丢失格式?
【发布时间】:2019-07-31 01:57:52
【问题描述】:

我对 Python 和 Jupyter Notebook 还是很陌生。因此,任何帮助将不胜感激。在this 问题之后,我能够为我的 DataFrame 的特定单元格着色。

现在假设我有那个带有“样式”的表格(作为接受的答案中的那个),我希望通过电子邮件将它发送给某人(在这种情况下是我自己)而不会丢失任何格式(它应该包含彩色单元格、边框和其他所有内容)。

我尝试使用 .render() 函数,然后将 HTML 代码附加到电子邮件正文,但我不断得到一个没有结构的无边框表格。我已经按照post 对电子邮件部分进行了编码。唯一的区别是我没有使用“纯文本”部分。

另外,如何向表格本身添加更多功能?比如添加表格标题、修改列间距、增大或减小字体大小?

谢谢!

【问题讨论】:

  • 你试过.to_html方法吗?
  • 在某些情况下,你不能真正拥有所有的风格。这取决于您打开电子邮件的位置。例如,不同版本的 MS Outlook 支持不同的 html 标签集。
  • @AlexFish 是正确的。你有点受限。在这种情况下,您将无法使用 css 样式。所有样式都必须使用 MS Outlook 内联。请参阅下面的答案以获取解决方案。
  • @Dai,是的,我有,但没有成功。
  • @AlexFish 你知道我可以尝试通过电子邮件发送样式表的其他方法吗?

标签: python pandas dataframe jupyter-notebook html-email


【解决方案1】:

这是我在这种情况下使用的一个函数。 for 循环是创建带状行。

def html_style_basic(df,index=True):
    import pandas as pd
    x = df.to_html(index = index)
    x = x.replace('<table border="1" class="dataframe">','<table style="border-collapse: collapse; border-spacing: 0; width: 25%;">')
    x = x.replace('<th>','<th style="text-align: left; padding: 2px; border-left: 1px solid #cdd0d4;" align="left">')
    x = x.replace('<td>','<td style="text-align: left; padding: 2px; border-left: 1px solid #cdd0d4; border-right: 1px solid #cdd0d4;" align="left">')
    x = x.replace('<tr style="text-align: right;">','<tr>')

    x = x.split()
    count = 2 
    index = 0
    for i in x:
        if '<tr>' in i:
            count+=1
            if count%2==0:
                x[index] = x[index].replace('<tr>','<tr style="background-color: #f2f2f2;" bgcolor="#f2f2f2">')
        index += 1
    return ' '.join(x)

【讨论】:

  • 我必须将“to_html()”部分更改为“render()”,因为我正在发送样式数据帧。它确实改善了表格的整体外观,但它也改变了我拥有的彩色单元格。颜色现在显示在随机单元格上,而不是我最初指定的单元格上。
【解决方案2】:

我能够在这篇帖子之后找到我的问题的答案:how to draw a beautiful colorful table with pandas or other package in Python?

本质上,如果您在为单元格添加颜色后使用 .set_table_styles 添加边框,则电子邮件发送的 html 代码将正确显示。希望对遇到同样问题的人有所帮助。

【讨论】:

    【解决方案3】:

    基于你已经通过Format the color of a cell in a pandas dataframe according to multiple conditions获得了一个样式化的DataFrame,那么你可以将它保存到一个html文件中。

    with open('DataFrame.html', 'a') as f:
        f.write(df.render() )
    

    如需进一步定制,请访问https://pandas.pydata.org/pandas-docs/stable/user_guide/style.html。

    【讨论】:

    • 我试过这样做,但无边框表格仍然存在。
    • @user11861242 那是因为原表是df无边框的。
    • 如何在保留彩色单元格的同时为其添加边框?请问有什么想法吗?我尝试了上面的答案,它确实为表格添加了更多结构,但它与我的样式单元格混淆了。
    • @user11861242,抱歉,我对为此类对象添加边框知之甚少。
    • @user11861242 stackoverflow.com/questions/49888173/… 为原始DataFrame 添加边框
    猜你喜欢
    • 2020-07-21
    • 2017-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-08
    • 2017-12-19
    相关资源
    最近更新 更多