我已经把这个头挠得太久了。在这里-
在尝试对用户模型类进行一些更改后,我尝试导出用户模型类,然后将其作为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 object save as http response to create download in 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 object save as http response to create download in Django的第二个答案中,作者提供了一个示例,该示例创建了一个新工作簿并使用BytesIO完成更改后将其下载。我想知道我是否可以将这种方法与使用BytesIO的现有工作簿一起使用?
我也尝试过使用OpenPyXl库来完成此任务,因为事实证明,运气也不好。我在Return openpyxl workbook object as HttpResponse in django. Is it possible?使用OpenPyXl的方法找到了这篇文章,发现的一件有趣的事是
from openpyxl.writer.excel import save_virtual_workbook
我想知道xlsxwriter库是否有类似save_virtual_workbook
的东西,因此我可以将工作簿保存在类似
response = HttpResponse(content=save_virtual_workbook(workbook), mimetype='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet')
有人可以帮我解决这个问题吗?
答案 0 :(得分:1)
我猜应该是响应['Content-Type'] ,而不是响应['content_type']
编辑:
以下是对我有用的
from xlwt import Workbook
def render_excel_report(request):
if request.GET:
input_form = ReportInputForm(request.GET)
if input_form.is_valid():
wb = Workbook()
...
# Create a response object
response = HttpResponse(mimetype='application/vnd.ms-excel')
response['Content-Disposition'] = '''attachment; filename="download.xls"'''
# Save the workbook to response object
wb.save(response)
# Return the response object
return response
else:
...
注意:我正在使用XLWT
答案 1 :(得分:1)
使用BytesIO()和worksheet.writer可以实例化现有查询集,下面的代码应该可以工作,并为您提供Excel文件的下拉列表
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)
groupnames = []
for group in groups:
groupnames.append(group.name)
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")
output = io.BytesIO()
workbook = xlsxwriter.Workbook(output, {'in_memory': True})
worksheet = workbook.add_worksheet()
worksheet.write('A1', 'Username')
worksheet.write('B1', 'Firstname')
worksheet.write('C1', 'Lastname')
worksheet.write('D1', 'Desiredintake')
worksheet.write('E1', 'Intakeyear')
worksheet.write('F1', 'StudentId')
worksheet.write('G1', 'Course')
worksheet.write('H1', 'CourseId')
worksheet.write('I1', 'Groups')
i = 2
for obj in queryset:
worksheet.write('A'+str(i), obj.username)
worksheet.write('B'+str(i), obj.first_name)
worksheet.write('C'+str(i), obj.last_name)
worksheet.write('D'+str(i), str(obj.desiredintake))
worksheet.write('E'+str(i), obj.intakeyear)
worksheet.write('F'+str(i), obj.id)
worksheet.write('G'+str(i), str(course))
worksheet.write('H'+str(i), str(courseid.id))
txt = 'Select a value from a drop down list'
worksheet.write('I'+str(i), txt)
worksheet.data_validation('I'+str(i), {'validate': 'list',
'source': groupnames})
i += 1
# Close the workbook before sending the data.
workbook.close()
# Rewind the buffer.
output.seek(0)
# Set up the Http response.
# filename = 'students.xlsx'
response = HttpResponse(
output,
content_type='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
)
# response['Content-Disposition'] = 'attachment; filename=%s' % filename
response['Content-Disposition'] = 'attachment; filename="students.xlsx"'
return response
else:
args = {'form': form}
return render(request, 'epitaadmin/export_studentscsv.html', args)
答案 2 :(得分:0)
save_virtual_workbook()
已过时。
您应将python的tempfile.NamedTempFile
类与BytesIO
一起使用。
from tempfile import NamedTemporaryFile
responseStream = None
with NamedTemporaryFile() as tmpFile:
wb.save(tmpFile.name)
tmpFile.seek(0)
responseStream = BytesIO(tmpFile.read())
return flask.send_file(
responseStream, as_attachment=True,
attachment_filename = 'report.xlsx',
mimetype = wb.mime_type
)
Python管理NamedTemporaryFile
文件的自动清除。
阅读:OpenPyXl文档