仪表板数据表下载到excel

2024-05-14 22:02:49 发布

您现在位置:Python中文网/ 问答频道 /正文

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


Tags: csvto脚本idoutputdatasavehtml
3条回答

我假设您正试图从共享的代码段导出到csv文件。如果是这样的话,我已经在本other thread中回答了出口在dash_table中是官方支持的。我分享了以下片段:

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)

是,您正在触发下载到服务器的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)

查看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()

相关问题 更多 >

    热门问题