Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django/Pandas-创建Excel文件并作为下载_Python_Django_Pandas_Export To Excel - Fatal编程技术网

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

Python Django/Pandas-创建Excel文件并作为下载,python,django,pandas,export-to-excel,Python,Django,Pandas,Export To Excel,我正在尝试使用pandas创建一个Excel文件,并通过Django将其作为可下载文件提供给用户。我在这里找到了一些关于这个主题的不同答案,最后得到了以下代码: collection = [{"title": "something", "price": 34, "quantity": 23}, {..}] output = BytesIO() df = pd.Dat

我正在尝试使用pandas创建一个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", "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
        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

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


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

在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
        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
解决方案

事实证明,我必须删除一些内容,因此代码现在看起来像这样,并且工作正常:

        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
        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

我想你可能把事情弄得比实际情况复杂得多

下面对我来说很好:

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

我想你可能把事情弄得比实际情况复杂得多

下面对我来说很好:

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