Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x Dash在内存中下载生成的文件按钮点击:如何给出文件名?_Python 3.x_Button_Download_Filenames_Plotly Dash - Fatal编程技术网

Python 3.x Dash在内存中下载生成的文件按钮点击:如何给出文件名?

Python 3.x Dash在内存中下载生成的文件按钮点击:如何给出文件名?,python-3.x,button,download,filenames,plotly-dash,Python 3.x,Button,Download,Filenames,Plotly Dash,我通过pd.ExcelWriter和BytesIO为我的Python3.8 dash应用程序中的点击事件生成内存中的Excel文件 一切都按它应该的样子运行。当我下载文件时,我会收到一条弹出消息,询问我是否要继续下载/打开生成的文件。但是,弹出消息显示了这个(我猜是base64encoded)字符串(或路径?),例如…ydahdjhgk328aaaaanxsaa==,下载后会得到一组(随机分配的?)字符作为文件名(例如zysdn1.xlsx) 我如何调整它以使其显示并将文件名分配给类似于down

我通过
pd.ExcelWriter
BytesIO
为我的Python3.8 dash应用程序中的点击事件生成内存中的Excel文件

一切都按它应该的样子运行。当我下载文件时,我会收到一条弹出消息,询问我是否要继续下载/打开生成的文件。但是,弹出消息显示了这个(我猜是
base64
encoded)字符串(或路径?),例如
…ydahdjhgk328aaaaanxsaa==
,下载后会得到一组(随机分配的?)字符作为文件名(例如
zysdn1.xlsx

我如何调整它以使其显示并将文件名分配给类似于
download.xlsx
?我猜这与
base64
encoded
href
有关

生成excel文件的函数:

def write_product_file():
    output = BytesIO()
    writer = pd.ExcelWriter(output, engine="xlsxwriter")
    upload_df = pd.DataFrame()
    upload_df.to_excel(writer, index=False, sheet_name="sheet1")
    writer.save()
    return output
“我的仪表板”应用程序中的按钮:

html.Div(
  id="select-upload-form",
  style={"width": "100%"},
  children=[
    dbc.Button(
      "Download the upload form",
      id="download-excel",
      color="secondary",
      external_link="true",
      target="",
      href="",
    ),
  ],
),
最后,我回电话:

@app.callback(
    [
        Output("download-excel", "href"),
        Output("download-excel", "color"),
        Output("download-excel", "target"),
    ],
    [Input("download-excel", "n_clicks")],
)
def download_template_file(n_clicks):
    if n_clicks:
        excelfile = write_product_file()
        excelfile.seek(0)
        media_type = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
        data = base64.b64encode(excelfile.read()).decode("utf-8")
        href_data = f"data:{media_type};base64,{data}"
        return href_data, "success", href_data,
    else:
        return None, "secondary", None


您可以使用仪表板扩展包中的
下载
组件

pip install dash-extensions == 0.0.18
语法更简单,它有一个
filename
参数。这是一个小例子

import dash
import dash_html_components as html
import numpy as np
import pandas as pd

from dash.dependencies import Output, Input
from dash_extensions import Download
from dash_extensions.snippets import send_bytes

# Generate some example data.
data = np.column_stack((np.arange(10), np.arange(10) * 2))
df = pd.DataFrame(columns=["a column", "another column"], data=data)
# Create app.
app = dash.Dash(prevent_initial_callbacks=True)
app.layout = html.Div([html.Button("Download xlsx", id="btn"), Download(id="download")])


@app.callback(Output("download", "data"), [Input("btn", "n_clicks")])
def generate_xlsx(n_nlicks):

    def to_xlsx(bytes_io):
        xslx_writer = pd.ExcelWriter(bytes_io, engine="xlsxwriter")
        df.to_excel(xslx_writer, index=False, sheet_name="sheet1")
        xslx_writer.save()

    return send_bytes(to_xlsx, "some_name.xlsx")


if __name__ == '__main__':
    app.run_server()

免责声明:我是dash extensions软件包的作者。

工作完美!嗨,ehmher,非常感谢您的支持!这对我帮助很大。我在想,如果我的应用程序确实需要初始回调,而我不想触发此下载回调,有没有办法做到这一点?是的,您可以将prevent\u initial\u call=True添加到回调本身。