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
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
发表评论