Dash Python实现带列格式的Excel下载及to_excel多值报错解决
问题原因
你遇到的报错和格式不生效问题来源于两处逻辑错误:
- 你设置好自定义格式的Excel文件仅存储在服务端本地,返回给用户时仍然调用了未带格式的
df.to_excel方法,之前的格式配置完全没有用到 dcc.send_data_frame会自动为df.to_excel传入第一个参数excel_writer(指向内存IO对象),和你手动传入的参数冲突,所以触发了重复参数的报错。
解决方法
改用内存IO存储生成好的带格式Excel,直接返回二进制内容即可,不需要用dcc.send_data_frame:
- 首先引入
io.BytesIO用于内存存储 - 将带格式的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
相关产品推荐
相关产品推荐

