破折号数据表下载到excel

Sri*_*san 2 python plotly-dash

我目前正在使用以下脚本从我创建的破折号下载数据表。下载工作正常,但是当我在本地托管 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"

Run Code Online (Sandbox Code Playgroud)

Joh*_*par 5

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

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()
Run Code Online (Sandbox Code Playgroud)


Tom*_*Tom 0

是的,您正在触发下载到服务器的 C 驱动器。请参阅从此处获取的以下示例代码,它应该可以满足您的要求:

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)
Run Code Online (Sandbox Code Playgroud)