Django Pandas 数据框下载为 Excel 文件

10

我有一个Django应用程序,将被放置在Docker容器中。

该应用程序以Dataframe格式准备数据。 我想允许用户将数据下载到本地驱动器作为Excel文件。

我过去曾使用过df.to_excel,但在这种情况下无法使用。

请建议最佳方法来完成此操作。


你能分享一下你现在使用 df.to_excel 做了什么,以及为什么它不起作用吗? - Willem Van Onsem
df.to_excel会下载到本地驱动器。但在这种情况下,应用程序将作为Docker镜像在远程服务器上运行。 - jscriptor
2个回答

20

开始,您可以直接让 Django 向 BytesIO 写入内容,例如:

from django.http import HttpResponse
from io import <b>BytesIO</b>

def some_view(request):
    with BytesIO() as <b>b</b>:
        # Use the StringIO object as the filehandle.
        <b>writer = pd.ExcelWriter(b, engine='xlsxwriter')</b>
        df.to_excel(writer, sheet_name='Sheet1')
        writer.save()
        # Set up the Http response.
        filename = 'django_simple.xlsx'
        response = HttpResponse(
            b.getvalue(),
            content_type='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
        )
        response['Content-Disposition'] = 'attachment; filename=%s' % filename
        return response

你可能需要安装一个Excel写入模块(比如 xlsxwriteropenpyxl)。


你好。我正在使用您的函数,除了传入df之外。我还添加了一行代码:ldm_df.to_excel("D:\Users\myfolder\test.xlsx"),就在您的返回语句之前,以验证我可以写入Excel。我目前正在本地主机上运行。我希望返回HttpResponse以显示下载到临时文件夹,但是没有任何东西被下载。请告诉我我错过了什么。谢谢您的帮助。 - jscriptor
1
嗨。我正在使用ajax调用我的某个版本的视图。-- $ .ajax({ headers:{"X-CSRFToken":csrftoken}, url:'carmaapp/export_data', data:{ 'user_selections':adict, }, type:“POST”, success:function(data){ alert(data) }, error:function(errMsg){ alert(errMsg); } }); ----我该如何将数据推送到用户主文件夹中的Excel文件? - jscriptor
@jscriptor:你不能“推送”文件到一个目录中,因为HTML/JavaScript无法访问用户的磁盘,或者说通常情况下是不行的,浏览器监控的选项非常有限。但是你可以让用户确认保存它,参见这里:https://dev59.com/8m855IYBdhLWcg3wFAHy#9970672 - Willem Van Onsem
@jscriptor:但这似乎并没有太多意义,因为至少有一些数据(35KB)被传输,我们期望它至少显示一些数据。你是在writer.save()之后才打印出来的吗? - Willem Van Onsem
@jscriptor:如果你在writer.save()之后立即执行b.flush()会怎样? - Willem Van Onsem
显示剩余16条评论

2

我认为现在可以更简单、更简洁。只需直接将http响应传递给Excel写入器即可。以下内容适用于我:

from django.http import HttpResponse
import pandas as pd

# df = CREATE YOUR OWN DATAFRAME

response = HttpResponse(content_type='application/xlsx')
response['Content-Disposition'] = f'attachment; filename="FILENAME.xlsx"'
with pd.ExcelWriter(response) as writer:
    df.to_excel(writer, sheet_name='SHEET NAME')

return response

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