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

CGI脚本返回Pandas DataFrame为Excel文件时损坏问题求助

问题解决:CGI返回Excel文件损坏的修复方案

问题根源

你的代码里用print(excel_bytes)输出二进制Excel内容是错误的——Python的print函数会把字节对象转换成字符串表示形式(比如开头的b'和结尾的'都会被当成文件内容输出),这直接破坏了xlsx文件的二进制结构(xlsx本质是Zip压缩包,开头必须是PK字节),导致Excel识别为损坏文件。

修复步骤

1. 修正二进制内容输出方式

在CGI环境中,二进制内容需要直接写入标准输出的缓冲流,不能用print。替换print(excel_bytes)为sys.stdout.buffer.write()。

2. 修正函数内变量错误

get_excel函数参数是df,但内部调用的是data_df.to_excel,这会触发NameError,需改为df.to_excel。

最终修正代码

import sys
import pandas as pd
from io import BytesIO

def get_excel(df: pd.DataFrame):
    xlsdata = BytesIO()
    writer = pd.ExcelWriter(xlsdata)
    df.to_excel(writer, index=False, sheet_name='Sheet1')  # 修正变量名
    writer.close()
    xlsdata.seek(0)
    return xlsdata

def send_excel_response(excel_file: BytesIO, filename: str):
    # 输出HTTP响应头(文本模式)
    print("Content-type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")
    print(f"Content-Disposition: attachment; filename={filename}.xlsx")
    print(f"Content-Length: {excel_file.getbuffer().nbytes}")
    print()  # 空行分隔响应头和内容
    
    # 直接输出二进制Excel内容
    sys.stdout.buffer.write(excel_file.getvalue())

原理说明

  • HTTP响应头是文本格式,用print输出没问题;
  • 二进制文件内容必须通过sys.stdout.buffer.write()直接输出原始字节,避免Python将字节对象转换为字符串表示,保证xlsx文件的Zip结构完整,Excel就能正常打开。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 04:34:55