Я слишком долго чесал голову.Вот и все -
Я пытаюсь экспортировать класс пользовательской модели (в виде таблицы Excel), после внесения в него некоторых изменений и возврата его в качестве объекта HttpResponse для загрузки.Вот мой код представления:
if request.method == 'POST':
form = ExportStudentscsv(request.POST)
if form.is_valid():
data = form.cleaned_data
#get course from dropdown value
course = data.get('course')
# find course id based on course title
courseid = Course.objects.get(title=course)
#find groups using course id
groups = Groups.objects.filter(course=courseid)
desiredintake = data.get('desiredintake')
intakeyear = data.get('intakeyear')
user_resource = UserResource()
queryset = User.objects.filter(desiredintake=desiredintake, intakeyear=intakeyear, role=4)
if not queryset:
return page_not_found(request, "Bad Request")
dataset = user_resource.export(queryset)
dataset.xls
response = HttpResponse(dataset.xls, content_type='application/vnd.ms-excel')
response['Content-Disposition'] = 'attachment; filename="students.xls"'
workbook = xlsxwriter.Workbook(response, {'in_memory': True})
worksheet = workbook.add_worksheet('Groups')
worksheet.data_validation('B11', {'validate': 'list',
'source': ['open', 'high', 'close']})
workbook.close()
response['content_type'] = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
response['Content-Disposition'] = 'attachment; filename=students.xls'
return response
else:
args = {'form': form}
return render(request, 'epitaadmin/export_studentscsv.html', args)
Я следовал подходу, приведенному в третьем ответе, данном в этом посте Объект XlsxWriter, сохраняемый как ответ http для создания загрузки в Django , но не повезло.Я не получаю изменения проверки данных, сделанные здесь -
workbook = xlsxwriter.Workbook(response, {'in_memory': True})
worksheet = workbook.add_worksheet('Groups')
worksheet.data_validation('B11', {'validate': 'list',
'source': ['open', 'high', 'close']})
workbook.close()
т.е.раскрывающийся список, который я пытаюсь создать, не отражается в загруженном файле Students.xls.
Во втором ответе того же поста объект XlsxWriter сохранить как ответ http для создания загрузки в Django ,автор привел пример создания новой рабочей книги и загрузки ее с изменениями, выполненными с помощью BytesIO.Интересно, могу ли я использовать этот подход с существующей рабочей книгой, использующей BytesIO?
Я также пытался использовать библиотеку OpenPyXl для этой задачи, поскольку с этим тоже не получается.Я нашел этот пост с подходом, использующим OpenPyXl здесь Возвращает объект книги openpyxl как HttpResponse в django.Возможно ли это? , одна интересная вещь, которую я обнаружил, была
from openpyxl.writer.excel import save_virtual_workbook
Мне было интересно, есть ли подобная вещь, как save_virtual_workbook
для библиотеки xlsxwriter, чтобы я мог сохранить свою книгу в ответе, как
response = HttpResponse(content=save_virtual_workbook(workbook), mimetype='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet')
Может кто-нибудь помочь мне с этой проблемой?