动态生成具有行距/嵌套的html表

时间:2018-11-27 16:18:16

标签: python html dataframe html-table

我想从Python数据框创建HTML表以生成电子邮件报告。

我希望能够通过设置不同的行跨度以在不同的列上进行聚合来动态生成这些表并将其分组。用户可以在其中选择要对其进行分组的列。

按一列分组时,我可以很容易地做到这一点。但是,当我想在两列(例如下面的Code和CCY列)上进行操作时,请说:

https://imgur.com/kgwdBFm

<html>
   <table cellpadding="4" style="border: 1px solid #000000; border-collapse: collapse;" border="1">
      <tr>
      <thead>
         <th>Code</th>
         <th>Total # of Entries</th>
         <th>A</th>
         <th>B</th>
         <th>Description</th>
         <th>Ccy</th>
         <th>Date 1</th>
         <th>Date 2</th>
         <th>Px_chg_pct</th>
      </thead>
      </tr>
      <tr>
         <td>ABC</td>
         <td>1</td>
         <td>4405</td>
         <td>3B1070</td>
         <td>TEXT</td>
         <td>USD</td>
         <td>1109</td>
         <td>1108</td>
         <td>0.2415</td>
      </tr>
      <tr>
         <td rowspan=3>DEF</td>
         <td rowspan='3'>3</td>
         <td>6490</td>
         <td>17878</td>
         <td>CURRENCY EXCHANGE</td>
         <td rowspan=2>CAD</td>
         <td>11.6</td>
         <td>7.9</td>
         <td>-0.5</td>
      </tr>
      <tr>
         <td colspan>C036490</td>
         <td>U78</td>
         <td>CURRENCY EXCHANGE1</td>
         <td>20.57</td>
         <td>27.9</td>
         <td>-0.2625</td>
      </tr>
      <tr>
         <td colspan>C036490</td>
         <td>31B3078</td>
         <td>CURRENCY EXCHANGE</td>[enter image description here][1]
         <td>USD</td>
         <td>0.57</td>
         <td>2.1</td>
         <td>-0.25</td>
      </tr>
   </table>
</html>

我在执行此操作时遇到了一些麻烦。

我目前的逻辑是找到聚合器列,并在该聚合器索引之后创建一个总列,并对它进行“硬编码”。请原谅我画的质量。

def add_data_rows_to_tables(html_code,pivot_pos,length,style,aggregate_on):
if length == 1:
    html_code += row_start + style + '>'
    for index, row in pivot_pos.iterrows():
        for all in pivot_pos.columns.tolist():
            html_code += '<td>%s</td>' % row[all]
    html_code += row_end

else:
    html_code += row_start + style + '>'
    first = pivot_pos.iloc[0]
    for all in pivot_pos.columns.tolist():
        if all != aggregate_on and all != 'Total for %s'%aggregate_on:
            html_code += '<td>%s</td>' % first[all]
        if all == aggregate_on:
            html_code += '<td rowspan=%d>%s</td>' % (length, pivot_pos[aggregate_on].iloc[0])
        if all == 'Total for %s'%aggregate_on:
            html_code += '<td rowspan=%d>%s</td>' % (length, length)
        if all == 'Ccy':
            html_code += '<td rowspan=%d>%s</td>' % (length, length)

    html_code += row_end

    for i in range(1,length):
        html_code += row_start + style + '>'
        for all in pivot_pos.columns.tolist():
            if all != aggregate_on and all != 'Total for %s'%aggregate_on:
                html_code += '<td>%s</td>' % pivot_pos[all].iloc[i]
        html_code += row_end
return html_code

但是,当添加多个列以进行聚合/跨度操作时,这实际上并不能很好地工作,并且由于必须事先设置跨度(或者可能是我误会了),因此我无法进行正确的递归调用。

请告知我是否有任何提示。 预先感谢!

1 个答案:

答案 0 :(得分:0)

我认为我将尝试将可能的嵌套及其对应的rowpan值预处理/预先计算成每个类别组合的矩阵。 然后在创建表时,可能要查找每行数据的行跨度。