欢迎来到徐庆高(Tea)的个人博客网站
磨难很爱我,一度将我连根拔起。从惊慌失措到心力交瘁,我孤身一人,但并不孤独无依。依赖那些依赖我的人,信任那些信任我的人,帮助那些给予我帮助的人。如果我愿意,可以分裂成无数面镜子,让他们看见我,就像看见自己。察言观色和模仿学习是我的领域。像每个深受创伤的人那样,最终,我学会了随遇而安。
当前位置: 日志文章 > 详细内容

Django HTTPResponse响应体中返回openpyxl生成的文件过程

2025年08月03日 https
django返回文件流时使用指定文件名http响应头中字符应该按照url百分号编码# python3from urllib.parse import quote...# 字符串编码问题 str(fil

django返回文件流时使用指定文件名

http响应头中字符应该按照url百分号编码

# python3
from urllib.parse import quote
...

# 字符串编码问题 str(filename) ---- filename为文件名, 可能需要转换为字符串先
response['content-disposition'] = 'attachment; filename={0}.xlsx'.format(quote(filename))

django httpresponse响应体中返回openpyxl生成的文件

直接将 openpyxl 生成 excel 文档写入到 django 的httpresponse 对象响应体中

在 openpyxl 的源码中的有一个save_virtual_workbook 方法, 这个方法跟save在同一个文件,

导入路径为

from openpyxl.writer.excel import save_virtual_workbook
@deprecated("use a namedtemporaryfile")
def save_virtual_workbook(workbook):
    """return an in-memory workbook, suitable for a django response."""
    tmp = temporaryfile()
    archive = zipfile(tmp, 'w', zip_deflated, allowzip64=true)

    writer = excelwriter(workbook, archive)
    writer.save()

    tmp.seek(0)
    virtual_workbook = tmp.read()
    tmp.close()

    return virtual_workbook

在django中使用并返回

from django.http import httpresponse
from openpyxl import workbook
from openpyxl.writer.excel import save_virtual_workbook
from urllib import quote


# 导出数据
def export_data(request):

    wb = openpyxl.workbook()
	'''
	....为写入数据的步骤 略
	'''

	# 吧文件流写入 返回体
    response = httpresponse(content=save_virtual_workbook(wb),
                            content_type='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet')
    # 给返回的文件命名
    response['content-disposition'] = 'attachment; filename={0}.xlsx'.format(quote(str(title)))  # 中文名字

    return response


总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。