Django / Pandas-创建Excel文件并用作下载

问题描述

我正在尝试使用熊猫创建Excel文件,并通过Django将其作为可下载文件提供给用户。我对在这里找到的主题进行了一些不同的回答,最终得到了以下代码:

        collection = [{"title": "something","price": 34,"quantity": 23},{..}]

        output = BytesIO()

        df = pd.DataFrame(collection,columns=['title','price','quantity'])

        writer = pd.ExcelWriter(output,engine='xlsxwriter')
        df.to_excel(writer,sheet_name='Sheet1')
        writer.save()

        output.seek(0)
        workbook = output.getvalue()

        response = StreamingHttpResponse(workbook,content_type='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet')
        response['Content-Disposition'] = f'attachment; filename={output_name}.xlsx'
        return response

一切正常,直到我尝试打开生成的文件为止-我可能会出错,说明文件已损坏或数据格式有问题。我怀疑这可能与二进制数据有关吗?我该如何解决这个问题?

解决方案

结果是我不得不删除一些东西,所以代码现在看起来像这样,并且运行良好:

        collection = [{"title": "something",sheet_name='Sheet1')
        writer.save()

        output.seek(0)
        # workbook = output.getvalue()

        response = StreamingHttpResponse(output,content_type='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet')
        response['Content-Disposition'] = f'attachment; filename={output_name}.xlsx'
        return response

解决方法

我认为您可能会使事情变得复杂得多。

以下对我来说很好:

import pandas as pd
from django.http import HttpResponse

df = pd.DataFrame(data)
response = HttpResponse(content_type='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet')
response['Content-Disposition'] = 'attachment; filename="filename.xlsx"'                                        
df.to_excel(response)
return response
,

在Excel中打开时,可能是数据类型问题,请尝试将数据转换为字符串,然后创建excel并尝试。

另一种想法是用一组记录样本创建文件,而不是用整个框架来验证文件是否存在数据问题。数据集中的Nan也可能存在问题。检查是否需要忽略/转换/替换它。

,

解决方案

结果是我不得不删除一些东西,所以代码现在看起来像这样,并且运行良好:

        collection = [{"title": "something","price": 34,"quantity": 23},{..}]

        output = BytesIO()

        df = pd.DataFrame(collection,columns=['title','price','quantity'])

        writer = pd.ExcelWriter(output,engine='xlsxwriter')
        df.to_excel(writer,sheet_name='Sheet1')
        writer.save()

        output.seek(0)
        # workbook = output.getvalue()

        response = StreamingHttpResponse(output,content_type='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet')
        response['Content-Disposition'] = f'attachment; filename={output_name}.xlsx'
        return response

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...