首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python:在内存和流文件下载中生成xlsx?

Python:在内存和流文件下载中生成xlsx?
EN

Stack Overflow用户
提问于 2014-12-10 04:04:44
回答 2查看 6K关注 0票数 4

例如,下面的代码首先创建xlsx文件,然后将其作为下载文件流,但我想知道是否有可能在创建xlsx数据时发送它。例如,想象一下,如果需要生成一个非常大的xlsx文件,用户必须等待它完成,然后接收下载,我想要的是在用户浏览器中启动xlsx文件下载,然后在生成数据时发送数据。使用.csv文件似乎很简单,但对于xlsx文件则不是这样。

代码语言:javascript
复制
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
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-03-09 17:21:15

您能够在生成XLSX的同时将tempfiles写入磁盘吗?

如果您能够使用tempfile,您将不会绑定内存,这很好,但是下载仍然只有在XLSX编写器组装完文档之后才会开始。

如果您不能编写tempfile,那么您必须遵循这个示例server.html,不幸的是,您的代码完全是内存绑定的。

另一方面,流媒体CSV非常容易。下面是用于在CSV响应中流行迭代器的代码:

代码语言:javascript
复制
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
票数 6
EN

Stack Overflow用户

发布于 2014-12-10 04:57:18

xlsx格式是一个zip文件,包含多个单独的文件,因此您不能动态创建它并在创建时将其发送出去。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27393160

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档