动态生成并流式传输一个巨大的Excel文件?

3

我正在编写一个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文件吗? - jmunsch
通过数据库,我指的是“任何迭代器”。我基本上需要一个等价于这个csv_view函数的东西,它可以即时生成XLS而不是CSV。@jmunsch - d33tah
可能可以创建一个最大大小为Excel所能处理的SpooledTemporaryFile,然后流式传输分块的Excel文件?看起来write_only模式使用具有无限大小的NamedTemporaryFile?不确定用例。 - jmunsch
你可以使用ADO查询xlsx文件并将其转换为记录集,然后进行迭代处理。 - SierraOscar
@MacroMan:你能详细解释一下吗? - d33tah
1
如果您可以通过COM处理Excel工作簿,那么范围对象就有一个.CopyFromRecordSet()方法,这意味着您不必使用迭代器 - 只需将数据从数据库获取到记录集中,然后使用该方法一次性“转储”数据即可。 - SierraOscar
1个回答

3

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


谢谢!常规的 .xls 文件呢? - d33tah
1
我不确定,但我怀疑。无论如何不能处理“巨大”的XLS文件:仅限于256列和65,000多行。 - Charlie Clark

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接