(数据科学学习手札117)Python+Dash快速web应用开发——交互表格篇(下) (2)

  而dash_table同样可以实现后端筛选,和前面的后端排序类似,主要利用filter_query属性的回调变化在后台基于pandas等框架进行数据筛选,比较简单,这里就不再赘述。

2.2 自带的数据表格下载功能

  dash_table还自带了将当前所渲染的表格内容直接下载为csv或xlsx格式文件的简易功能,通过参数export_format设置导出的文件格式,但自带的下载按钮样式比较丑,如果你对此有比较高的要求,还是建议结合之前的上传下载篇自己设计相关功能:

(数据科学学习手札117)Python+Dash快速web应用开发——交互表格篇(下)

图5 2.3 冻结首行

  通过设置参数fixed_rows={'headers': True},我们可以实现下滑查看表格的过程中,始终保持表头被冻结:

(数据科学学习手札117)Python+Dash快速web应用开发——交互表格篇(下)

图6 3 开发一个在线取数工具

  在学习完今天的内容之后,我们来结合之前上传下载篇中提到的下载功能,来制作一个简单的对指定数据库中的数据表进行快速条件筛选并下载的工具,其中DataTable的derived_virtual_data属性记录了经过排序、条件筛选等操作后当前显示的表格数据:

(数据科学学习手札117)Python+Dash快速web应用开发——交互表格篇(下)

图7

app4.py

import dash import dash_bootstrap_components as dbc import dash_core_components as dcc import dash_html_components as html import dash_table from dash.dependencies import Input, Output from flask import send_from_directory import os import uuid from sqlalchemy import create_engine import pandas as pd try: os.mkdir("downloads") except FileExistsError: pass engine = create_engine('mysql+pymysql://root:mysql@localhost/DASH') app = dash.Dash(__name__) @app.server.route('/download/<file>') def download(file): return send_from_directory('downloads', file) app.layout = dbc.Container( [ dbc.Row( [ dbc.Col(dbc.Button('更新数据表',, style={'width': '100%'}), width=2), dbc.Col(dcc.Dropdown(id='table-select', style={'width': '100%'}), width=2) ] ), html.Hr(), dash_table.DataTable(, editable=True, page_size=15, style_header={ 'font-family': 'Times New Romer', 'font-weight': 'bold', 'text-align': 'center' }, style_data={ 'font-family': 'Times New Romer', 'text-align': 'center' }, style_data_conditional=[ { # 对选中状态下的单元格进行自定义样式 "if": {"state": "selected"}, "background-color": "#b3e5fc", "border": "none" }, ], filter_action="native" ), html.Br(), html.A(id='download-url', target="_blank") ], style={ 'margin-top': '50px' } ) @app.callback( Output('table-select', 'options'), Input('refresh-tables', 'n_clicks') ) def refresh_tables(n_clicks): if n_clicks: return [ { 'label': table, 'value': table } for table in pd.read_sql_query('SHOW TABLES', con=engine)['Tables_in_dash'] ] return dash.no_update @app.callback( [Output('dash-table', 'data'), Output('dash-table', 'columns')], Input('table-select', 'value') ) def render_dash_table(value): if value: df = pd.read_sql_table(value, con=engine) return df.to_dict('records'), [ {'name': column, 'id': column} for column in df.columns ] else: return [], [] @app.callback( [Output("download-url", "href"), Output("download-url", "children")], [Input("dash-table", "derived_virtual_data"), Input("dash-table", "filter_query")], prevent_initial_call=True ) def download_table(derived_virtual_data, filter_query): if derived_virtual_data: print(derived_virtual_data) filename = f"output_{uuid.uuid1()}.xlsx" pd.DataFrame(derived_virtual_data).to_excel("downloads/" + filename, index=False) return "/download/" + filename, "下载当前状态表格" return "", "" if __name__ == '__main__': app.run_server(debug=True)

  以上就是本文的全部内容,欢迎在评论区发表你的意见与观点。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wsffdy.html