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
相关产品推荐
相关产品推荐

