流式传输一个巨大的 Excel 文件,动态创建它?

Posted

技术标签:

【中文标题】流式传输一个巨大的 Excel 文件,动态创建它?【英文标题】:Stream a huge Excel file, creating it on the fly? 【发布时间】:2016-08-03 08:43:33 【问题描述】:

我正在编写一个 Web 应用程序,它有时可能会在 Excel 文件中输出数十万行(甚至更多行)。 openpyxl 被选择用于 Excel 输出准备,但我不确定是否可以从数据库中读取数据并同时输出。有没有办法做到这一点?这是我在 CSV 中的意思的示例:

def csv_view(request, iterator, keys):
    """A view that streams a large CSV file."""

    class Echo(object):
        """An object that implements just the write method of the file-like
        interface.
        """
        def write(self, value):
            """Write the value by returning it,
               instead of storing in a buffer."""
            return value

    def get_iter():

        writer = csv.writer(Echo())
        yield writer.writerow(keys)
        for row in iterator:
            yield writer.writerow(row)

    response = StreamingHttpResponse(get_iter(), content_type="text/csv")
    response['Content-Disposition'] = 'attachment; filename="output.csv"'
    return response

【问题讨论】:

数据库是指csv文件吗? 数据库我的意思是“任何迭代器”。我基本上需要一个等效的 csv_view 函数,它可以动态生成 XLS 而不是 CSV。 @jmunsch 可能能够创建一个SpooledTemporaryFile,其最大大小为 excel 可以处理的大小,然后流式传输分块的 excel 文件?看起来write_only 模式使用了无限大小的NamedTemporaryFile?不确定用例。 您可以使用 ado 将 xlsx 文件查询到记录集并对其进行迭代? 如果您可以通过 COM 使用 Excel 工作簿 - 范围对象有一个 .CopyFromRecordSet() 方法,这意味着您不必使用迭代器 - 只需将您的数据从数据库中获取到记录集并使用该方法一次性“转储”数据。 【参考方案1】:

openpyxl 已经提供了write-only 模式,专为流式使用而设计。但是,由于所有 XSLX 文件实际上都是 zip 文件,并且由于 zip 格式不允许流式传输,因此无法在写入 XLSX 文件时对其进行流式传输。

【讨论】:

谢谢!还有常规的 .xls? 我不知道,但我对此表示怀疑。无论如何都不能处理“巨大”的 XLS 文件:限制为 256 列和 65,000 奇数行。

以上是关于流式传输一个巨大的 Excel 文件,动态创建它?的主要内容,如果未能解决你的问题,请参考以下文章

将 excel 文件从 MVC 5 控制器流式传输到浏览器

如何在 PowerShell 中使用 XmlReader 流式传输大/巨大的 XML 文件?

使用 GSON 的 JsonReader 流式传输 Json 文件时,您可以将对象转储为字符串吗?

GKE 流式传输大文件下载失败并出现部分响应

从网络服务器流式传输音频

在 C++ 中连续流式传输 PCM 数据?