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

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


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值