在 Dash Python 中下载包含列格式的 excel 文件

Download an excel file with column formatting in Dash Python

我正在创建一个 Dash 应用程序,我希望允许用户通过单击按钮将 pandas Dataframe 下载为 excel 文件。

我设法用这个回调实现了它:

@app.callback(
Output("download_xlsx", "data"),
Input("btn_download_xlsx", "n_clicks"), State("df", "data")
)
def download_xlsx(n_clicks, json_df):
    df =  pd.read_json(json_df)
    return dcc.send_data_frame(df.to_excel, "nom_fic.xlsx", **{'sheet_name': "Feuil1", 'index': False})

效果很好,但是 Excel 文件的格式不是我想要的,特别是因为第一列是一个非常大的整数并且 Excel 用科学记数法显示它,我想强制Excel 显示整个整数。

我尝试使用 XlsxWriter 格式化 :

@app.callback(
Output("download_xlsx", "data"),
Input("btn_download_xlsx", "n_clicks"), State("df", "data")
)
def download_xlsx(n_clicks, json_df):
    df =  pd.read_json(json_df)

    writer = pd.ExcelWriter("nom_fic.xlsx", engine='xlsxwriter')
    df.to_excel(writer, sheet_name="Feuil1", index=False)

    workbook = writer.book
    worksheet = writer.sheets["Feuil1"]

    format = workbook.add_format({'num_format': '#,##00.0'})
    worksheet.set_column('A:A', None, format)

    writer.save()

    return dcc.send_data_frame(df.to_excel, "nom_fic.xlsx", **{'sheet_name': "Feuil1", 'index': False})

但是当我尝试下载文件时收到以下回调错误:

TypeError: to_excel() got multiple values for argument 'excel_writer'

有人可以看到我如何处理 to_excel() 输入以便我可以使用我想要的格式的作者,或者有任何其他想法来解决这个问题吗?

谢谢:)

我最终找到了一种格式化 Excel 文件然后允许用户下载它的方法。我使用 xlsxwriter 格式化我的工作簿,然后将其保存在应用程序环境中,并使用 dcc.send_file 而不是 dcc.send_data_frame :

@app.callback(
Output("download_xlsx", "data"),
Input("btn_download_xlsx", "n_clicks"), State("df", "data")
)
def download_xlsx(n_clicks, json_df):
    df =  pd.read_json(json_df)

    if os.path.exists("export.xlsx"): 
         os.remove("export.xlsx")

    writer = pd.ExcelWriter("export.xlsx", engine='xlsxwriter')
    df.to_excel(writer, sheet_name="Feuil1", index=False)

    workbook = writer.book
    worksheet = writer.sheets["Feuil1"]

    format = workbook.add_format({'num_format': '#,##00.0'})
    worksheet.set_column('A:A', None, format)

    writer.save()

    return dcc.send_file("export.xlsx", "filename.xlsx")

它在本地只有一个用户时运行良好,但我担心部署后当多个用户同时使用该应用程序时会出现问题。 (因为它在服务器数据里写了一个文件,是所有用户共享的)


编辑:我找到了我正在寻找的解决方案,方法是使用在回调中定义的函数,该函数将文件作为输入的 BytesIo 进行格式化,然后写入。现在它不需要将格式化后的 excel 写入存储在服务器中的文件中:

@app.callback(
    Output("download_xlsx", "data"),
    Input("btn_download_xlsx", "n_clicks"),
    State("df", "data")
)
def download_xlsx(n_clicks, json_df):
    df =  pd.read_json(json_df)

    def to_xlsx(bytes_io):
        writer = pd.ExcelWriter("export.xlsx", engine='xlsxwriter')
        df.to_excel(writer, sheet_name="Feuil1", index=False)

        workbook = writer.book
        worksheet = writer.sheets["Feuil1"]

        format = workbook.add_format({'num_format': '#,##00.0'})
        worksheet.set_column('A:A', None, format)

        writer.save()

    return dcc.bytes(to_xlsx, "filename.xlsx")