将Pandas .set_table_styles()与tr:nth-child选择器和属性一起使用并渲染HTML

fdx2calv  于 2023-09-29  发布在  其他
关注(0)|答案(1)|浏览(99)

我是新来使用Pandas造型,所以我发现这一切都很困难,但我试图采取Pandas数据框架。然后,我想应用表样式的颜色tr:nth-child(odd)行某种颜色。
我看到set_table_styles()的代码采用了CSS选择器和Poperties的字典来定义这些样式。
我假设我想要的表的选择器是'selector':'tr:nth-child(old)',props是'props'['background': 'blue']
然而,这不会产生条带化结果,并且无法解决这个问题。我已经成功地与一些其他风格的选择工作,但不是这一个特别。
最后,我需要呈现的HTML,因为即时通讯插入到一个电子邮件产生的布微软Outlook。
任何帮助托特实现这一目标将不胜感激。下面是一个片段的文字,产生我的电子邮件,但现在表行剥离

myMessage = """<HTML>
                    segmentStuffHere
               <HTML>"""

segmentParts = ""

for seg, dF in segmentDataFrames.items():
    html = (
    dF.style
    .set_table_styles([{'selector': 'tr:nth-child(odd)', 'props': [('background', '#FFF')]}])
    .render()
            )
    myMessagePart = """

                    <BODY>
                        <font color="black">
                            The break-out by "{segment}" is as follows:<br><br>
                            {htmlTable}
                            <br>
                        </font>
                    </BODY>

                """.format(htmlTable=html, segment=seg)

    segmentParts += myMessagePart

myMessage = myMessage.replace('segmentStuffHere', segmentParts)
print(myMessage)

# print(myMessage)
outlook = Dispatch("Outlook.Application")

#Contruct a message Body found above ^
# Found the below syntax is needed to build outlook object to send message. 
msg = outlook.CreateItem(0)
msg.To = '{}@email.com'.format('user')
# msg.CC = emailCC

msg.Subject = 'Segment Test'

msg.GetInspector
index = msg.HTMLbody.find('>', msg.HTMLbody.find('<body'))
msg.HTMLbody = msg.HTMLbody[:index + 1] + myMessage + msg.HTMLbody[index + 1:]
# msg.HTMLBody = myMessage

msg.Display(False)
# msg.BodyFormat = '3'
msg.Send()
print('Email Sent!')```
sg3maiej

sg3maiej1#

在我的代码中前进并解决新问题时。我偶然发现了一个完美的解决方案。我能够编写一个函数并使用.apply()函数按行执行此操作。

def style_email_tables(s):
    return ['text-align: center; border-style: solid; border-collapse: collapse; border-width: 1.5px; border-color: #CCD4DC' if s.name % 2 else 'background-color: #EFF2F8; text-align: center; border-style: solid; border-collapse: collapse; border-width: 1.5px; border-color: #CCD4DC' for v in s]

def styleDataFrame(dataFrame, columnSubset=None):
    if columnSubset:
        tableHTML = (
                dataFrame.style.apply(style_email_tables, axis=1)
                        .set_properties(subset=columnSubset, **{'width':'10em', 'text-align':'center'})
                        .set_table_styles([{'selector':'th', 'props': [('border-style','solid'),('border-collapse', 'collapse'),('border-width','1.5px'), ('border-color', '#CCD4DC'), ('text-align', 'center'), ('background', '#102038')]}])
                        .hide_index()
                        .render()
            )

相关问题