【问题标题】:Dash Data table download to excelDash 数据表下载到 Excel
【发布时间】:2020-04-28 17:11:26
【问题描述】:

我目前正在使用以下脚本从我创建的破折号下载数据表。下载工作正常,但是当我在本地托管 Dash 并且尝试通过另一个系统单击下载按钮时,文件正在主机而不是用户计算机上下载。如果我的问题看起来很愚蠢,我深表歉意,因为我对 Dash 和 python 很陌生。

html.Button(id="save-button", n_clicks=0, children="Save"),
html.Div(id="output-1", children="Press button to save data at your desktop")


@app.callback(
    Output("output-1", "children"),
    [Input("save-button", "n_clicks")],
    [State("table", "data")])
def selected_data_to_csv(nclicks, table1):
    if nclicks == 0:
        raise dash.PreventUpdate
    else:
        df = pd.DataFrame(table1).to_csv(
            'C:\\Users\\'+loggedin_user + '\\Desktop\\Open_Queue_Dump.csv', index=False)
    return "Data Submitted"

【问题讨论】:

    标签: python plotly-dash


    【解决方案1】:

    查看dash-extensions package,帮助我开发了我的应用程序。它有一个名为“下载”的组件。当您将某些内容返回给它时,系统会提示用户下载它。所以你的代码可能看起来像这样:

    import io
    import dash
    import dash_html_components as html
    from dash.dependencies import Input, Output, State
    from dash.exceptions import PreventUpdate
    from dash_extensions import Download
    import dash_table
    from flask import Flask
    import pandas as pd
    
    server = Flask(__name__)
    app = dash.Dash(server=server)
    
    df = pd.read_csv('https://raw.githubusercontent.com/plotly/datasets/master/solar.csv')
    
    app.layout = html.Div(
                    [
                        Download(id="download"),
                        html.Button("Save",
                                    id="save-button"),
                        html.Div("Press button to save data at your desktop",
                                 id="output-1"),
                        dash_table.DataTable(
                            id='table',
                            columns=[{"name": i, "id": i} for i in df.columns],
                            data=df.to_dict('records'),
                        )
                    ]
                )
    
    
    @app.callback(
    Output("download", "data"),
    Input("save-button", "n_clicks"),
    State("table", "data"))
    def download_as_csv(n_clicks, table_data):
        df = pd.DataFrame.from_dict(table_data)
        if not n_clicks:
          raise PreventUpdate
        download_buffer = io.StringIO()
        df.to_csv(download_buffer, index=False)
        download_buffer.seek(0)
        return dict(content=download_buffer.getvalue(), filename="some_filename.csv")
    
    if __name__ == '__main__':
        app.run_server()
    

    【讨论】:

      【解决方案2】:

      我假设您正在尝试从您共享的 sn-p 导出到 csv 文件。如果是这种情况,我已经在other thread 中回答说,dash_table 中官方支持导出。我分享了以下sn-p:

      import dash_table
      table = dash_table.DataTable(
          id="table",
          columns=[{"name": i, "id": i} for i in df.columns],
          data=df.to_dict("records"),
          export_format="csv",  # This will make an export button appear
      )
      

      但是,导出格式也可以是xlsx,如the docs 中指定的那样。然后你会得到以下代码:

      import dash_table
      table = dash_table.DataTable(
          id="table",
          columns=[{"name": i, "id": i} for i in df.columns],
          data=df.to_dict("records"),
          export_format="xlsx",  # This will make an export button appear
      )
      

      table 只是指组件。定义后,您可以在代码中使用它:

      table = ...
      
      app = dash.Dash(__name__)
      server = app.server
      
      app.layout = html.Div([
          html.P("Here's my table:"),
          table
      ])
      
      if __name__ == "__main__":
          app.run_server(debug=True)
      

      【讨论】:

        【解决方案3】:

        是的,您正在触发下载到服务器的 C 盘。请参阅以下来自here 的示例代码,它应该可以满足您的需求:

        import dash
        import dash_core_components as dcc
        import dash_html_components as html
        import pandas as pd
        import urllib
        
        df = pd.DataFrame({
            'a': [1, 2, 3, 4],
            'b': [2, 1, 5, 6],
            'c': ['x', 'x', 'y', 'y']
        })
        
        
        def generate_table(dataframe, max_rows=10):
            return html.Table(
                # Header
                [html.Tr([html.Th(col) for col in dataframe.columns])] +
        
                # Body
                [html.Tr([
                    html.Td(dataframe.iloc[i][col]) for col in dataframe.columns
                ]) for i in range(min(len(dataframe), max_rows))]
            )
        
        
        app = dash.Dash(__name__)
        app.css.append_css({"external_url": "https://codepen.io/chriddyp/pen/bWLwgP.css"})
        app.layout = html.Div([
            html.Label('Filter'),
        
            dcc.Dropdown(
                id='field-dropdown',
                options=[
                    {'label': i, 'value': i} for i in
                    (['all'] + list(df['c'].unique()))],
                value='all'
            ),
            html.Div(id='table'),
            html.A(
                'Download Data',
                id='download-link',
                download="rawdata.csv",
                href="",
                target="_blank"
            )
        ])
        
        
        def filter_data(value):
            if value == 'all':
                return df
            else:
                return df[df['c'] == value]
        
        
        @app.callback(
            dash.dependencies.Output('table', 'children'),
            [dash.dependencies.Input('field-dropdown', 'value')])
        def update_table(filter_value):
            dff = filter_data(filter_value)
            return generate_table(dff)
        
        
        @app.callback(
            dash.dependencies.Output('download-link', 'href'),
            [dash.dependencies.Input('field-dropdown', 'value')])
        def update_download_link(filter_value):
            dff = filter_data(filter_value)
            csv_string = dff.to_csv(index=False, encoding='utf-8')
            csv_string = "data:text/csv;charset=utf-8," + urllib.quote(csv_string)
            return csv_string
        
        
        if __name__ == '__main__':
            app.run_server(debug=True)
        

        【讨论】:

        • 它仍在下载到服务器文件夹而不是用户文件夹。任何建议。
        • 你在点击下载链接吗?
        • 是的,我愿意。它仍然保存在服务器文件夹而不是用户。请告知如何进行。我是 python 和 Dash 的新手,很难找出我哪里出错了。
        猜你喜欢
        • 2023-03-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-04
        • 1970-01-01
        相关资源
        最近更新 更多