У меня есть представление django, которое я хочу вернуть в файл Excel. Код ниже:
def get_template(request, spec_pk):
spec = get_object_or_404(Spec, pk=spec_pk)
response = HttpResponse(spec.get_template(), mimetype='application/ms-excel')
response['Content-Disposition'] = 'attachment; filename=%s_template.xls' % spec.name
return response
В этом примере тип spec.get_template()
равен <type 'bytearray'>
, который содержит двоичные данные электронной таблицы Excel.
Проблема в том, что когда я пытаюсь загрузить это представление и открыть его в Excel, оно появляется как искаженные двоичные данные. Я знаю, что bytearray
правильно, хотя, если я сделаю следующее:
f = open('temp.xls', 'wb')
f.write(spec.get_template())
Я прекрасно могу открыть temp.xls
в Excel.
Я даже зашел так далеко, что изменил свой взгляд на:
def get_template(request, spec_pk):
spec = get_object_or_404(Spec, pk=spec_pk)
f = open('/home/user/temp.xls', 'wb')
f.write(spec.get_template())
f.close()
f = open('/home/user/temp.xls', 'rb')
response = HttpResponse(f.read(), mimetype='application/ms-excel')
response['Content-Disposition'] = 'attachment; filename=%s_template.xls' % spec.name
return response
И это прекрасно работает - я могу открыть файл xls из браузера в Excel, и все в порядке.
Так что мой вопрос: что мне нужно сделать bytearray
, прежде чем передать его HttpResponse
. Почему сохранение его в двоичном виде с последующим повторным открытием работает идеально, но передача самого bytearray
приводит к искаженным данным?