1. Sreamlit aggrid简介

Sreamlit aggrid是Streamlit的Ag-Grid组件的实现,在Python Streamlit框架下,更加灵活的使用表格,包括分组、排序、编辑、选择行等等,功能较为强大,补充Streamlit表格处理弱的情况,结合Streamlit可视化图,方便数据分析人员实现可视化数据分析报告。

ag-grid是一款功能和性能强大外观漂亮的表格插件,ag-grid几乎能满足你对数据表格所有需求。固定列、拖动列大小和位置、多表头、自定义排序等等各种常用又必不可少功能。关于收费的问题,绝大部分应用用免费的社区版就够了,ag-grid-community社区版一样功能强大。
中文API文档: https://www.itxst.com/ag-grid/tutorial.html

Sreamlit aggrid资源地址如下:

  • https://github.com/PablocFonseca/streamlit-aggrid
  • https://streamlit-aggrid.readthedocs.io/en/docs/

使用Streamlit-aggrid,直接pip安装即可:
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple Streamlit-aggrid

2. 文档查询下载功能实践

2.1. 功能描述

根据关键字、文档分类、时间、搜索等方法,查询返回的结果用表格呈现,往往存在很多行数据的情况,需要从中选择目标文档。通过选中行,获取所在行的文档名称,或者文档ID。再依据文档名称(或文档ID),从Mongo DB数据库中获取文件,下载到本地。界面效果如下所示。
在这里插入图片描述

2.2. 代码实现

2.2.1. 查询文件

在Mongo DB数据库中,给出如下结构:
在这里插入图片描述
本实践案例,先以简单查询为例,直接查询全量集合(表)中的数据(可以自行加模糊查询等)。

# 数据库,集合名称
def queryfile(db,collectionname):
    collection = db[collectionname]
    query_dict = {}
    col_name = {"_id":0 ,"filename":1 ,"length":1,'classic':1,'keyword':1,'descripte':1,'length':1,'uploadDate':1,'filetype':1} 
    df = pd.DataFrame(list(collection.find(query_dict,col_name)))
    rencolnames = {"filename":'文件名称' ,"length":'文件长度','classic':'文件分类','keyword':'关键字','descripte':'文件描述','uploadDate':'上传日期','filetype':'文件类型'}
    colnames = ['文件名称' ,'文件长度','文件分类','关键字','文件描述','上传日期','文件类型']
    
    df = df.rename(columns=rencolnames)
    df = df[colnames]
    
    return df

2.2.2. 构造可选中行的表格

构造可选中行的表格涉及到两个函数,分别是渲染表格的AgGrid()和定义表格操作的GridOptionsBuilder类。

  • AgGrid是用于渲染页面表格的主要函数。详见“https://streamlit-aggrid.readthedocs.io/en/docs/AgGrid.html”

  • GridOptionsBuilder类可用于帮助定义gridOptions字典。尽管网格的配置可以通过传递字典来完成,但建议使用GridOptionsBuilder。https://streamlit-aggrid.readthedocs.io/en/docs/GridOptionsBuilder.html

实践案例,定义单行选择表,选中行的数据,可以按字段/关键字读取出来。参考官方样例源代码见streamlit-aggrid examples

# 定义单行选择表,选中行的数据,可以按字段/关键字读取出来
def aggrid(df):
    gb = GridOptionsBuilder.from_dataframe(df)
    selection_mode = 'single' # 定义单选模式,多选为'multiple'
    enable_enterprise_modules = True # 设置企业化模型,可以筛选等
    #gb.configure_default_column(editable=True) #定义允许编辑
    
    return_mode_value = DataReturnMode.FILTERED  #__members__[return_mode]
    gb.configure_selection(selection_mode, use_checkbox=True) # 定义use_checkbox
    
    gb.configure_side_bar()
    gb.configure_grid_options(domLayout='normal')
    gb.configure_pagination(paginationAutoPageSize=True)
    gridOptions = gb.build()
    
    update_mode_value = GridUpdateMode.MODEL_CHANGED
    
    grid_response = AgGrid(
                        df, 
                        gridOptions=gridOptions,
                        data_return_mode=return_mode_value,
                        update_mode=update_mode_value,
                        enable_enterprise_modules=enable_enterprise_modules,
                        )  
    df = grid_response['data']
    selected = grid_response['selected_rows']
    
    return df, selected  

2.2.3. 下载文档

# 文件下载
def filedownload():
    st.header("文档查询下载")
    st.markdown('查询数据库中的文档,显示文档列表。')
    db = connectmongo()
    df= queryfile(db,'books.files')

    df,selected = aggrid(df)
    
    if (len(selected)>0):
        filenameList = selected[0]
        inputfilename=filenameList['文件名称']
    else:
        inputfilename='请选择文件名'
            
    file_coll = 'books'    
    with st.form(key='filename'):
        filename=st.text_input('输入文件名',inputfilename)
        submit_button = st.form_submit_button(label='确认')            
    
    if submit_button:
        gridfs_col = GridFS(db, collection=file_coll)
        file_data = gridfs_col.get_version(filename=filename, version=-1).read()
        st.download_button('下载文件', file_data,file_name = filename) 

其他相关代码详见博文《Python+Streamlit+MongoDB GridFS构建低代码文档管理应用(Demo篇)》

参考:
[1].heianduck. Streamlit(四) - st.dataframe. CSDN博客. 2022-01
[2]. 肖永威. Python+Streamlit+MongoDB GridFS构建低代码文档管理应用(Demo篇). CSDN博客. 2022.04

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐