例如,下面的代码首先创建xlsx文件,然后将其作为下载文件流,但我想知道是否有可能在创建xlsx数据时发送它。例如,想象一下,如果需要生成一个非常大的xlsx文件,用户必须等待它完成,然后接收下载,我想要的是在用户浏览器中启动xlsx文件下载,然后在生成数据时发送数据。使用.csv文件似乎很简单,但对于xlsx文件则不是这样。
try:
import cStringIO as StringIO
except ImportError:
import StringIO
from django.http import HttpResponse
from xlsxwriter.workbook import Workbook
def your_view(request):
# your view logic here
# create a workbook in memory
output = StringIO.StringIO()
book = Workbook(output)
sheet = book.add_worksheet('test')
sheet.write(0, 0, 'Hello, world!')
book.close()
# construct response
output.seek(0)
response = HttpResponse(output.read(), mimetype="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")
response['Content-Disposition'] = "attachment; filename=test.xlsx"
return response发布于 2015-03-09 17:21:15
您能够在生成XLSX的同时将tempfiles写入磁盘吗?
如果您能够使用tempfile,您将不会绑定内存,这很好,但是下载仍然只有在XLSX编写器组装完文档之后才会开始。
如果您不能编写tempfile,那么您必须遵循这个示例server.html,不幸的是,您的代码完全是内存绑定的。
另一方面,流媒体CSV非常容易。下面是用于在CSV响应中流行迭代器的代码:
import csv
import io
def csv_generator(data_generator):
csvfile = io.BytesIO()
csvwriter = csv.writer(csvfile)
def read_and_flush():
csvfile.seek(0)
data = csvfile.read()
csvfile.seek(0)
csvfile.truncate()
return data
for row in data_generator:
csvwriter.writerow(row)
yield read_and_flush()
def csv_stream_response(response, iterator, file_name="xxxx.csv"):
response.content_type = 'text/csv'
response.content_disposition = 'attachment;filename="' + file_name + '"'
response.charset = 'utf8'
response.content_encoding = 'utf8'
response.app_iter = csv_generator(iterator)
return response发布于 2014-12-10 04:57:18
xlsx格式是一个zip文件,包含多个单独的文件,因此您不能动态创建它并在创建时将其发送出去。
https://stackoverflow.com/questions/27393160
复制相似问题