You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Dash Python实现带列格式的Excel下载及to_excel多值报错解决

问题原因

你遇到的报错和格式不生效问题来源于两处逻辑错误:

  1. 你设置好自定义格式的Excel文件仅存储在服务端本地,返回给用户时仍然调用了未带格式的df.to_excel方法,之前的格式配置完全没有用到
  2. dcc.send_data_frame会自动为df.to_excel传入第一个参数excel_writer(指向内存IO对象),和你手动传入的参数冲突,所以触发了重复参数的报错。

解决方法

改用内存IO存储生成好的带格式Excel,直接返回二进制内容即可,不需要用dcc.send_data_frame:

  1. 首先引入io.BytesIO用于内存存储
  2. 将带格式的Excel写入内存IO对象,直接返回该对象的二进制内容

完整可运行回调代码

import io
import dash
from dash import dcc, Input, Output, State
import pandas as pd

# 其他应用初始化逻辑保持不变,仅修改回调部分
@app.callback(
    Output("download_xlsx", "data"),
    Input("btn_download_xlsx", "n_clicks"),
    State("df", "data"),
    prevent_initial_call=True
)
def download_xlsx(n_clicks, json_df):
    df = pd.read_json(json_df)
    # 在内存中创建二进制IO对象
    output = io.BytesIO()

    # 写入Excel到内存,配置格式
    with pd.ExcelWriter(output, engine="xlsxwriter") as writer:
        df.to_excel(writer, sheet_name="Feuil1", index=False)
        workbook = writer.book
        worksheet = writer.sheets["Feuil1"]
        # 按需调整数字格式:纯整数不显示科学计数法用'0',要千分位用'#,##0',要小数用'0.00'即可
        int_format = workbook.add_format({"num_format": "0"})
        # 设置首列(A列)使用该格式
        worksheet.set_column("A:A", None, int_format)
    
    # 移动IO指针到开头,读取完整内容
    output.seek(0)
    # 直接返回二进制内容给下载组件
    return dcc.send_bytes(output.read(), "nom_fic.xlsx")

注意事项

  • 不需要在服务端生成临时磁盘文件,所有操作都在内存完成,性能更高也避免了文件权限问题
  • prevent_initial_call=True可以避免页面加载时自动触发下载,符合按钮点击触发的交互逻辑
  • 数字格式可按需调整:如果需要保留两位小数就把num_format改成0.00,需要千分位分隔就改成#,##0即可。

内容的提问来源于stack exchange,提问作者yjn

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 01:06:03