You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于Pandas创建复杂HTML表格的技术资料与工具咨询

用Pandas+Jinja实现复杂样式HTML报表表格

核心思路

先通过Pandas完成数据分组、重复值聚合、单元格合并规则计算这些核心逻辑,再把处理后的结构化数据(包含合并参数、样式标记)传给Jinja模板,由模板负责渲染HTML结构和样式——既利用Pandas的数据分析能力简化逻辑,又保留Jinja的定制灵活性。

Pandas端核心处理步骤

  • 多表头构建:用Pandas的MultiIndex定义层级表头,示例代码:
    columns = pd.MultiIndex.from_tuples(
        [("销售数据", "区域"), ("销售数据", "季度"), ("销售数据", "金额"), ("库存数据", "库存数量")]
    )
    df = pd.DataFrame(data, columns=columns)
    
  • 重复值分组与合并规则计算:
    对需要合并的列(比如区域列),计算每个重复值的连续出现行数(rowspan),可通过groupby结合自定义逻辑实现:
    def calculate_rowspan(df, group_col):
        df['rowspan'] = df.groupby(group_col)[group_col].transform('count')
        # 仅保留每组第一行的rowspan值,其余设为0(渲染时跳过)
        df['rowspan'] = df.apply(
            lambda x: x['rowspan'] if x.name == df[df[group_col]==x[group_col]].index[0] else 0, 
            axis=1
        )
        return df
    df = calculate_rowspan(df, ('销售数据', '区域'))
    
  • 单元格着色标记:根据业务规则给单元格添加样式标记,比如金额超阈值标记高亮:
    df['amount_style'] = df[('销售数据', '金额')].apply(lambda x: 'highlight' if x > 10000 else '')
    

结合Jinja模板渲染

将处理后的Pandas数据转为字典/列表传给Jinja,模板中根据rowspan/colspan参数生成对应HTML属性,根据样式标记添加CSS类:

  • 简化版模板示例:
    <table class="report-table">
        <!-- 渲染多表头 -->
        <thead>
            {% for level in df.columns.levels %}
                <tr>
                    {% for col in df.columns.get_level_values(level).unique() %}
                        <th colspan="{{ df.columns.get_level_values(level).value_counts()[col] }}">{{ col }}</th>
                    {% endfor %}
                </tr>
            {% endfor %}
        </thead>
        <tbody>
            {% for idx, row in df.iterrows() %}
                <tr>
                    {% for col in df.columns %}
                        {% if col == ('销售数据', '区域') %}
                            {% if row['rowspan'] > 0 %}
                                <td rowspan="{{ row['rowspan'] }}" class="{{ row.get('region_style', '') }}">{{ row[col] }}</td>
                            {% endif %}
                        {% else %}
                            <td class="{{ row.get(f'{col[1]}_style', '') }}">{{ row[col] }}</td>
                        {% endif %}
                    {% endfor %}
                </tr>
            {% endfor %}
        </tbody>
    </table>
    
    注意:渲染时需跳过rowspan为0的单元格,避免重复渲染。

适配的表格格式化工具

  • Pandas Styler类:自带的df.style可直接生成带样式的HTML,支持单元格着色、合并(通过set_table_styles配合CSS)、多表头渲染,适合快速实现基础样式:
    styler = df.style.applymap(
        lambda x: 'background-color: #ffcccc' if x > 10000 else '', 
        subset=[('销售数据', '金额')]
    )
    html = styler.to_html()
    
    缺点是复杂合并逻辑需自定义CSS,灵活性不如Jinja,但能减少模板代码量。
  • DT(DataTables):如果需要前端交互(排序、分页),可先用Pandas生成基础HTML,再通过Jinja引入DataTables的JS库,实现美观且交互性强的报表。
  • Tabulate:支持输出HTML表格,可配合Pandas使用,但对多表头、合并单元格的支持有限,仅适合简单场景。

关键技术参考方向

  • Pandas官方文档:MultiIndex构建与操作、Styler类样式定制章节
  • Jinja官方文档:模板循环、条件判断及变量传递语法

内容的提问来源于stack exchange,提问作者Oren Shani

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 17:40:03