从 Dash (send_file) 下载包含多个工作表的 Excel 文件

Download Excel file with multiple sheets from Dash (send_file)

我一直在尝试创建一个仪表板,允许用户下载分隔在 Excel 文件的不同 sheet 中的数据。我设法单独创建了 Excel 文件,所以我知道它可以工作,但是当我尝试将文件作为输出发送时出现错误。我试过 send_data_frame 但它只会 return 第一个数据帧只有一个 sheet.

@app.callback(
Output("download-dataframe-xlsx", "data"),
Input("save-button", "n_clicks"),
State("memory-output", "data"),
prevent_initial_call=True)

def download_as_excel(n_clicks, table_data):
    if not n_clicks:
    raise PreventUpdate

    writer = pd.ExcelWriter('new_excel_file.xlsx', engine="xlsxwriter")
    for df in table_data:
       copytoexcel = pd.DataFrame(table_data[df])
       copytoexcel.to_excel(writer, sheet_name=df)
    writer.save()

    return send_file(writer,  attachment_filename="testing.xlsx", as_attachment=True)

总而言之,我有一个名为 table_data 的字典,我正在从另一个回调中导入它,该字典中有一个字符串作为键,一个列表作为值。 循环和数据有效,但一旦我尝试使用 Dash 执行它,文件将无法下载。

有什么帮助吗?我试过将它作为字节发送,data_frame,但没有成功!网上也很少有关于它的文档!

提前致谢!

您应该尝试 Dash 组件中的 dcc.send_file(...) :

@app.callback(
    Output("download-dataframe-xlsx", "data"),
    Input("save-button", "n_clicks"),
    State("memory-output", "data"),
prevent_initial_call=True)
def download_as_excel(n_clicks, table_data):
    if not n_clicks:
        raise PreventUpdate
    else:
        writer = pd.ExcelWriter('new_excel_file.xlsx', engine="xlsxwriter")
        for df in table_data:
           copytoexcel = pd.DataFrame(table_data[df])
           copytoexcel.to_excel(writer, sheet_name=df)
        writer.save()

        return dcc.send_file('new_excel_file.xlsx')