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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 08:12:24