求Python Streamlit实现表格列内嵌动态子表格的代码方案
要在Streamlit中实现表格列内嵌子表格的效果,由于原生st.dataframe/st.table不支持嵌套结构,我们可以通过手动构建HTML表格并渲染的方式实现,以下是具体方案:
实现思路
Streamlit支持通过st.markdown渲染自定义HTML,我们可以构造包含嵌套表格的HTML代码,将主表格指定单元格替换为子表格的HTML内容,从而实现内嵌效果。子表格的数据可以动态生成,行数会随数据自动扩展。
完整示例代码
import streamlit as st import pandas as pd # 构造主表格数据 main_data = { "HColumn1": ["Name", "Age", "Address"], "HColumn2": ["Alice", 30, ""] # 预留Address对应的单元格用于嵌入子表格 } main_df = pd.DataFrame(main_data) # 构造动态子表格数据(可根据实际需求从API/数据库获取) address_data = { "Location": ["Home", "Office", "Gym"], "Details": ["123 Main St", "456 Business Ave", "789 Fitness Rd"] } address_df = pd.DataFrame(address_data) def generate_nested_table(main_df, sub_df, target_row, target_col): """生成包含内嵌子表格的HTML代码""" # 初始化主表格HTML html = '<table border="1" cellpadding="6" cellspacing="0" style="border-collapse: collapse; width: 100%;">' # 添加主表格表头 html += '<tr style="background-color: #f0f2f6;">' for col in main_df.columns: html += f'<th style="text-align: left; padding: 8px;">{col}</th>' html += '</tr>' # 遍历主表格行,插入子表格到指定位置 for idx, row in main_df.iterrows(): html += '<tr>' for col in main_df.columns: if idx == target_row and col == target_col: # 插入子表格 html += '<td style="padding: 8px;">' html += '<table border="1" cellpadding="4" cellspacing="0" style="border-collapse: collapse; width: 100%;">' # 子表格表头 html += '<tr style="background-color: #e6e8eb;">' for sub_col in sub_df.columns: html += f'<th style="text-align: left; padding: 6px;">{sub_col}</th>' html += '</tr>' # 子表格数据行 for _, sub_row in sub_df.iterrows(): html += '<tr>' for sub_val in sub_row.values: html += f'<td style="padding: 6px;">{sub_val}</td>' html += '</tr>' html += '</table>' html += '</td>' else: html += f'<td style="padding: 8px;">{row[col]}</td>' html += '</tr>' html += '</table>' return html # 生成嵌套表格HTML(指定第3行(索引2)的HColumn2列嵌入子表格) nested_table_html = generate_nested_table(main_df, address_df, target_row=2, target_col="HColumn2") # 渲染嵌套表格 st.markdown(nested_table_html, unsafe_allow_html=True)
关键说明
- 动态扩展子表格:只需更新
address_data的内容,子表格会自动根据数据行数扩展,无需修改HTML生成逻辑。 - 样式自定义:通过调整HTML中的
style属性,可以修改表格的边框、背景色、内边距等样式,适配你的页面设计。 - 灵活定位:通过
target_row和target_col参数,可以指定任意主表格单元格嵌入子表格,满足不同位置的需求。
如果需要更复杂的交互(比如子表格排序、筛选),可以考虑使用streamlit-aggrid库,通过自定义单元格渲染器实现内嵌表格,但上述HTML方案无需额外依赖,更轻量易用。
内容的提问来源于stack exchange,提问作者Prathima Golla
相关产品推荐
相关产品推荐

