Django / Pandas — создать файл Excel и служить в качестве загрузки

#python #django #pandas #export-to-excel

#python #django #pandas #экспорт в Excel

Вопрос:

Я пытаюсь создать файл Excel с помощью pandas и предоставить его пользователю в виде загружаемого файла через 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
  

Ответ №1:

Я думаю, вы можете сделать это намного сложнее, чем это должно быть.

У меня все работает нормально:

 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
  

Ответ №2:

РЕШЕНИЕ

Оказывается, мне пришлось удалить некоторые вещи, поэтому код теперь выглядит так и работает нормально:

         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
  

Ответ №3:

Возможно, проблема с типом данных при открытии в Excel, попробуйте преобразовать данные в строки, а затем создайте Excel и попробуйте.

Другая мысль заключается в создании файла с образцовым набором записей, а не всего фрейма, чтобы проверить, есть ли проблема с данными. Также может возникнуть проблема с Nan в наборе данных. Проверьте, нужно ли вам игнорировать / конвертировать / заменять это.