流式传输一个巨大的 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 文件,动态创建它?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 PowerShell 中使用 XmlReader 流式传输大/巨大的 XML 文件?