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

Phi*_*p K 1 python django export-to-excel pandas

我正在尝试使用 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
Run Code Online (Sandbox Code Playgroud)

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

解决方案

结果我必须删除一些东西,所以代码现在看起来像这样并且工作正常:

        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
Run Code Online (Sandbox Code Playgroud)

sco*_*mus 11

我认为你可能会让事情变得比需要的复杂得多。

下面对我来说效果很好:

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
Run Code Online (Sandbox Code Playgroud)