本文示例代码已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes

1 简介

这是我的系列教程「Python+Dash快速web应用开发」的第十四期,在前两期中,我们针对dash_table的自定义样式、前后端分页、单元格内容编辑等特点展开了介绍。

而在dash_table中还有很多高级特性,可以极大程度上丰富DataTable()所渲染网页表格的交互能力,今天的文章作为「交互表格篇」的下篇,我们就来一起学习其中比较实用的一些特性。

图1

2 dash_table的更多实用功能

2.1 更多表格交互特性

上一期文章最后我们学习了通过设置参数editable=True,使得渲染出的表格可以通过鼠标双击进行编辑,而dash_table除此之外,还有更多实用的交互能力:

2.1.1 按列排序

  • 「普通单列排序」

DataTable()中,我们只需要设置参数sort_action='native',即可开启列排序功能,此时每一列列名单元格内都会出现部件供我们点击切换排序方式:

app1.py

import dash
import dash_table
import dash_bootstrap_components as dbcimport seaborn as snsdf = sns.load_dataset('iris')app = dash.Dash(__name__)app.layout = dbc.Container([dash_table.DataTable(data=df.to_dict('records'),columns=[{'name': column, 'id': column}for column in df.columns],style_table={'height': '500px','overflow-y': 'auto'},sort_action='native')],style={'margin-top': '50px'}
)if __name__ == '__main__':app.run_server(debug=True)

图2

  • 「基于后端排序的多列排序」

DataTable()中设置sort_action='native'时,对应的是「按列排序」的前端模式,也即是数据一次性灌注到浏览器的前提下进行排序,这种方式不仅不适合大型数据集,而且只支持「单列排序」

而当数据渲染方式为后端模式时,我们通过设置参数sort_action='custom'以及sort_mode='multi',配合在回调中获取属性sort_by中记录的参与排序的列名及升序降序方式,就可以实现多列排序。

我们在上一期的app2.py的基础上修改得到下面的例子:

app2.py

import dash
import dash_bootstrap_components as dbc
import dash_table
from dash.dependencies import Input, Outputimport seaborn as snsdf = sns.load_dataset('iris')
df.insert(0, '#', df.index)app = dash.Dash(__name__)app.layout = dbc.Container([dbc.Spinner(dash_table.DataTable(id='dash-table',columns=[{'name': column, 'id': column}for column in df.columns],page_size=15,  # 设置单页显示15行记录行数page_action='custom',page_current=0,style_header={'font-family': 'Times New Romer','font-weight': 'bold','text-align': 'center'},style_data={'font-family': 'Times New Romer','text-align': 'center'},sort_action='custom',sort_mode='multi'))],style={'margin-top': '50px'}
)@app.callback([Output('dash-table', 'data'),Output('dash-table', 'page_count')],[Input('dash-table', 'page_current'),Input('dash-table', 'page_size'),Input('dash-table', 'sort_by')]
)
def refresh_page_data(page_current, page_size, sort_by):if sort_by:return (df.sort_values([col['column_id'] for col in sort_by],ascending=[col['direction'] == 'asc'for col in sort_by]).iloc[page_current * page_size:(page_current + 1) * page_size].to_dict('records'),1 + df.shape[0] // page_size)return (df.iloc[page_current * page_size:(page_current + 1) * page_size].to_dict('records'),1 + df.shape[0] // page_size)if __name__ == '__main__':app.run_server(debug=True)

图3

2.1.2 按列条件筛选

除了基于指定字段进行排序之外,dash_table还支持列的条件筛选,设置filter_action="native",就可以开启基础的按列条件筛选功能,此时每一列表头下都会多出供用户输入筛选条件的单元格:

app3.py

import dash
import dash_table
import dash_bootstrap_components as dbcimport seaborn as snsdf = sns.load_dataset('iris')app = dash.Dash(__name__)app.layout = dbc.Container([dash_table.DataTable(data=df.to_dict('records'),columns=[{'name': column, 'id': column}for column in df.columns],# 自定义条件筛选单元格样式style_filter={'font-family': 'Times New Romer','background-color': '#e3f2fd'},style_table={'height': '500px','overflow-y': 'auto'},style_header={'font-family': 'Times New Romer','font-weight': 'bold','text-align': 'center'},style_data={'font-family': 'Times New Romer','text-align': 'center'},filter_action="native")],style={'margin-top': '50px'}
)if __name__ == '__main__':app.run_server(debug=True)

图4

dash_table中自带的条件筛选语法很丰富,有条件的朋友可以前往https://dash.plotly.com/datatable/filtering了解更多。

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

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

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

图5

2.3 冻结首行

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

图6

3 开发一个在线取数工具

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

图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, Outputfrom flask import send_from_directoryimport os
import uuid
from sqlalchemy import create_engine
import pandas as pdtry:os.mkdir("downloads")
except FileExistsError:passengine = 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('更新数据表', id='refresh-tables', style={'width': '100%'}), width=2),dbc.Col(dcc.Dropdown(id='table-select', style={'width': '100%'}), width=2)]),html.Hr(),dash_table.DataTable(id='dash-table',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)

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

推荐阅读

Pandas处理数据太慢,来试试Polars吧!

懒人必备!只需一行代码,就能导入所有的Python库

绝!关于pip的15个使用小技巧

介绍10个常用的Python内置函数,99.99%的人都在用!

可能是全网最完整的 Python 操作 Excel库总结!

用Python轻松开发数据库取数下载工具相关推荐

  1. python精彩编程200例pdf下载-最经典的25本Python编程开发电子书(附下载地址)!...

    如果,有人想转行程序猿,而让给出"如何切入编程"的建议的话,许多人一定毫不犹豫地向他推荐"Python"! 没错,就是这样一只Python,它让众多程序开发者, ...

  2. python编程入门电子书下载-最经典的25本Python编程开发电子书(附下载地址)!...

    如果,有人想转行程序猿,而让给出"如何切入编程"的建议的话,许多人一定毫不犹豫地向他推荐"Python"! 没错,就是这样一只Python,它让众多程序开发者, ...

  3. python读取mysql数据库行数_使用python读取mysql数据库并进行数据的操作

    (一)环境的配置 使用python调用mysql数据库要引进一些库. 目前我使用的python版本是python3.6.引进库为pymysql 其他对应的库可以有以下选择: mysqldb,oursq ...

  4. [006] [ESP32开发笔记] 使用Flash下载工具烧录固件步骤

    Flash下载工具链接 最终配置如下图所示,下面开始分步说明. 选择开发型号 SPI配置与Menuconfig中配置一致: 分区表(partition-table)地址查看: bootloader与p ...

  5. python爬虫开发数据库设计入门经典_Python3实现的爬虫爬取数据并存入mysql数据库操作示例...

    本文实例讲述了Python3实现的爬虫爬取数据并存入mysql数据库操作.分享给大家供大家参考,具体如下: 爬一个电脑客户端的订单.罗总推荐,抓包工具用的是HttpAnalyzerStdV7,与chr ...

  6. mysql自带的卸数工具_数据库卸数必备工具下载-数据库数据导出工具(DBexport)下载v1.3官方版-西西软件下载...

    DBexport是一款专业的数据库数据导出工具,支持多数据源导出,目前已测试Oracle,MySQL,SQL_SERVER无明显BUG,目前支持图片种的数据库,支持扩展功能,只要有对应的数据库jar和 ...

  7. java图书分析echarts_echarts从数据库取数

    从零开始学数据分析,什么程度可以找工作? 基本答一下吧,但是不是很准确,只了解大致情况(杭州),带有某种行业自黑. 1. 第一阶段(一般岗位叫数据专员) 基本学会excel(VBA最好学会;会做透视表 ...

  8. python爬虫开发数据库设计_基于Python的DBLP数据库爬虫系统

    老师让写个爬虫帮他爬点数据,以前没写过爬虫,网上查下Python挺方便的,花了一晚上把Python入了个门就开始写了,写篇博客记录下这个过程. 最近在上软件工程,用用软件工程那套来写下,嘿嘿. 1. ...

  9. 如何用Python从TripAdvisor抓取数十万条酒店评论

    我从TripAdvisor抓取一些酒店评论,然后发现了一种从它们那里刮掉数十万条酒店评论的好方法. 让我们假设,例如,我们要从大加那利岛刮掉酒店评论.如果转到TripAdvisor,我们将看到URL为 ...

最新文章

  1. deepin终端编译c程序_Deepin Linux安装使用Visual Studio Code(VSCode)调试C++
  2. 【洛谷比赛】你的名字。
  3. 零基础 Amazon Web Services (AWS) 入门教程图文版(一)
  4. 任务驱动在计算机教学中的应用,浅谈任务驱动法在《计算机应用基础》教学中的应用_优秀论文...
  5. 浏览文件神器!且可以计算所有文件代码的行数!
  6. 在虚拟机vmware中安装windows7保姆级教程
  7. Silverlight C# 游戏开发:草动系统(一)简单的草动
  8. python判断一个字符串在数组中的位置
  9. 国内十大优质黄金期货交易平台排名榜单(最新版一览)
  10. Windows AD域功能介绍、Windows AD域方案介绍
  11. 我设计开发的第一个产品发布了,微信小程序“集美装修效果图“
  12. 四 IDEA 项目另存为处理
  13. 采购订单审批与采购申请审批
  14. 安卓系统启动脚本init.rc说明文件readme.txt翻译
  15. 数组名和数组名取地址 的区别
  16. 忽如一夜春风来,千树万树梨花开
  17. GitHub 开源的超简单头像生成器,网友:好Q啊
  18. 前端证券项目_头条猿辅导瓜子老虎证券等前端面经
  19. Docker之container ls命令
  20. 【C语言】链表中倒数第k个结点【牛客】

热门文章

  1. 养成这6个编程好习惯,助你减少90%BUG
  2. Linux 安装 luarocks(lua的模块管理工具)
  3. PHP的chunk_split() 函数把字符串分割为一连串更小的部分
  4. matlab遗传算法m文件,matlab上安装遗传算法工具箱
  5. tp5 ajax 返回数据正常状态码却为500
  6. 抓包mysql协议_Mysql 通信协议抓包分析
  7. HTTP常用头部信息
  8. 必要商城MySQL开发规范
  9. pandas新建dataframe_pandas数据处理
  10. go 执行sh失败_为容器化的 Go 程序搭建 CI