Flask接口用XlsxWriter导出Excel异常:下载未知乱码文本文件
解决XlsxWriter导出Excel时下载为unknown.txt乱码文件的问题
看来你遇到的问题是浏览器没能正确识别生成的Excel文件类型,把二进制的Excel内容当成了文本文件处理,才出现了乱码和文件名错误的情况。我帮你分析下问题根源并给出修复方案:
核心问题分析
你的代码已经用XlsxWriter在内存中正确生成了Excel文件,但返回响应时没有明确指定匹配.xlsx格式的正确MIME类型,也没确保响应头配置准确,导致浏览器无法判断这是一个Excel文件,只能默认以txt格式解析二进制内容,最终出现乱码和unknown.txt的下载结果。
修复后的完整代码
直接修改返回响应的部分,确保MIME类型和响应头配置正确:
from flask import send_file, request import io import xlsxwriter @app.route("/api/v1/downloadexcel", methods=["GET"]) def excel_download2(): date_from = request.args.get("date_from") date_to = request.args.get("date_to") try: data_to_create_excel= get_data(date_from, date_to) output = io.BytesIO() workbook = xlsxwriter.Workbook(output, {'in_memory': True}) worksheet = workbook.add_worksheet('data_to_create_excel') headers = list(data_to_create_excel[0].keys()) if len(data_to_create_excel) else [] rows = [data.values() for data in data_to_create_excel] for row_num, row_data in enumerate([headers , *rows]): for col_num, col_data in enumerate(row_data): worksheet.write(row_num, col_num, col_data) workbook.close() output.seek(0) # 关键修复:指定正确的MIME类型和文件名参数 return send_file( output, mimetype='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', download_name="output.xlsx", as_attachment=True ) except Exception as e: print(e) return str(e), 500
关键修复点说明
- 匹配
.xlsx的MIME类型:XlsxWriter生成的是OpenXML格式的Excel文件,对应的MIME类型是application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,旧的application/ms-excel是针对.xls格式的,不能混用。 - 使用正确的文件名参数:在新版Flask中,
attachment_filename已被标记为过时,建议用download_name指定下载文件名,避免浏览器自动生成unknown命名。 - 保持BytesIO指针位置:你已经做了
output.seek(0),这一步很重要,确保从文件流的起始位置读取内容返回给客户端。
备选方案(用Response直接控制)
如果还是存在问题,可以尝试用Response对象直接返回,更精准控制响应头:
from flask import Response # 替换send_file部分的代码 return Response( output.getvalue(), mimetype='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', headers={ "Content-Disposition": "attachment; filename=output.xlsx", "Access-Control-Expose-Headers": "Content-Disposition" # 跨域场景下需要添加这个 } )
这样调整后,浏览器就能正确识别文件类型,下载到正常的output.xlsx文件了。
内容的提问来源于stack exchange,提问作者ashnav msit
相关产品推荐
相关产品推荐

