2016-04-27 6 views
7

Stavo seguendo the style guide for pandas e funzionava molto bene.pandas to_html utilizzando le opzioni .style o CSS personalizzati?

Come posso mantenere questi stili utilizzando il comando to_html tramite Outlook? La documentazione mi sembra un po 'carente.

(df.style 
    .format(percent) 
    .applymap(color_negative_red, subset=['col1', 'col2']) 
    .set_properties(**{'font-size': '9pt', 'font-family': 'Calibri'}) 
    .bar(subset=['col4', 'col5'], color='lightblue')) 

import win32com.client as win32 
outlook = win32.Dispatch('outlook.application') 
mail = outlook.CreateItem(0) 
mail.Subject = subject_name 
mail.HTMLbody = ('<html><body><p><body style="font-size:11pt; 
font-family:Calibri">Hello,</p> + '<p>Title of Data</p>' + df.to_html(
      index=False, classes=????????) '</body></html>') 
mail.send 

La documentazione to_html mostra che v'è un comando classi che posso mettere all'interno del metodo to_html, ma non può capire. Sembra anche che il mio dataframe non porti lo stile che ho specificato in alto.

se provo:

df = (df.style 
     .format(percent) 
     .applymap(color_negative_red, subset=['col1', 'col2']) 
     .set_properties(**{'font-size': '9pt', 'font-family': 'Calibri'}) 
     .bar(subset=['col4', 'col5'], color='lightblue')) 

Poi df è ormai un oggetto di stile e non è possibile utilizzare to_html.

Modifica: questo è ciò che sto facendo attualmente per modificare i miei tavoli. Funziona, ma non riesco a mantenere le caratteristiche interessanti del metodo .style che offre i panda.

email_paragraph = """ 
<body style= "font-size:11pt; font-family:Calibri; text-align:left; margin: 0px auto" > 
""" 

email_caption = """ 
<body style= "font-size:10pt; font-family:Century Gothic; text-align:center; margin: 0px auto" > 
""" 


email_style = '''<style type="text/css" media="screen" style="width:100%"> 
    table, th, td {border: 0px solid black; background-color: #eee; padding: 10px;} 
    th {background-color: #C6E2FF; color:black; font-family: Tahoma;font-size : 13; text-align: center;} 
    td {background-color: #fff; padding: 10px; font-family: Calibri; font-size : 12; text-align: center;} 
    </style>''' 
+0

Ho provato per ore ieri senza fortuna. Non riesco a capire come personalizzare il dataframe in Outlook. Sembra brutto (grande carattere). Il dataframe sul mio computer sembra carino .. Evidenzia dove la metrica non è riuscita a raggiungere il target, ha dei grafici a barre per mostrare il volume. Non c'è modo di farlo visualizzare sull'e-mail di Outlook? – trench

risposta

11

Una volta aggiunto style per le assegnazioni incatenati si opera su un oggetto Styler. Questo oggetto ha un metodo render per ottenere l'html come stringa. Quindi nel tuo esempio, si potrebbe fare qualcosa di simile:

html = (
    df.style 
    .format(percent) 
    .applymap(color_negative_red, subset=['col1', 'col2']) 
    .set_properties(**{'font-size': '9pt', 'font-family': 'Calibri'}) 
    .bar(subset=['col4', 'col5'], color='lightblue') 
    .render() 
) 

includono Poi il html via e-mail invece di un df.to_html().

+0

Questo ha funzionato e sembra fantastico, grazie! – trench

+0

In realtà, ho appena notato che i grafici a barre non vengono visualizzati nell'e-mail di Outlook. Tutto il resto funziona comunque bene. Qualche idea su come farla visualizzare? – trench

1

Non è una soluzione stravagante/pitoni. Ho inserito il link in un file css diretto prima del codice html creato dal metodo to_html(), quindi ho salvato l'intera stringa come file html. Questo ha funzionato bene per me.

dphtml = r'<link rel="stylesheet" type="text/css" media="screen" href="css-table.css" />' + '\n' 
dphtml += dp.to_html() 

with open('datatable.html','w') as f: 
    f.write(dphtml) 
    f.close() 
    pass