Flask HttpResponse 响应体中返回 openpyxl 生成的 Excel 文档

Flask HttpResponse 响应体中返回 openpyxl 生成的 Excel 文档

现在我需要提供一个链接,访问时通过 openpyxl 动态生成一个 Excel 文档,并作为响应体返回。

在这里将动态生成的 Excel 文档保存到服务器,并重定向到静态文件链接显然不是一个合适的做法。

所以我们需要直接将 openpyx 生成的 Excel 文档写入到 Flask 的 HttpResponse 对象响应体中。

研究源码后发现,openpyxl在保存excel文件时会使用save_workbook 这个函数,这个函数在 openpyxl.writer.excel 模块中定义。
打开这个文件,这里还定义了一个叫做 save_virtual_workbook 的函数,看来这就是我们要找的东西。

def save_virtual_workbook(workbook,):
    """Return an in-memory workbook, suitable for a Django response."""
    temp_buffer = BytesIO(
在处理Python生成超大Excel文件并通过Flask返回时,生成和处理时间过长的问题可以通过以下几种方法来解决: ### 1. 使用生成器分块处理数据 生成器可以逐行生成数据,而不是一次性将所有数据加载到内存中。这样可以显著减少内存使用和处理时间。 ```python from flask import Flask, Response, stream_with_context import pandas as pd app = Flask(__name__) @app.route('/download_excel') def download_excel(): def generate(): df = pd.DataFrame(columns=['列1', '列2', '列3']) for i in range(1000000): df.loc[i] = [i, i+1, i+2] if i % 1000 == 0: yield df.to_csv(index=False) df = pd.DataFrame(columns=['列1', '列2', '列3']) response = Response(stream_with_context(generate()), mimetype='text/csv') response.headers.set('Content-Disposition', 'attachment', filename='data.csv') return response if __name__ == '__main__': app.run(debug=True) ``` ### 2. 使用流式响应 Flask的`stream_with_context`可以帮助生成流式响应,从而避免一次性将所有数据加载到内存中。 ### 3. 使用异步任务队列 对于非常耗时的任务,可以使用Celery等异步任务队列,将生成Excel的任务放到后台执行,然后通过轮询或WebSocket通知将生成的文件返回给客户端。 ### 4. 使用更高效的文件格式 如果不需要Excel格式,可以考虑使用CSV或更高效的文件格式,如Parquet,这些格式在生成和处理时速度更快。 ### 5. 优化代码 确保在生成Excel文件时,尽量减少不必要的操作,如避免在循环中频繁创建DataFrame对象。 通过以上方法,可以有效减少生成超大Excel文件的时间和内存消耗。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值