Django XlsxWriter/OpenPyXl对象另存为HttpResponse以创建下载

Django XlsxWriter/OpenPyXl对象另存为HttpResponse以创建下载,django,excel,openpyxl,xlsxwriter,Django,Excel,Openpyxl,Xlsxwriter,这件事让我挠头太久了。就这样- 我正在尝试将一个用户模型类导出为excel工作表,对其进行一些更改后,将其作为HttpResponse对象返回以供下载。以下是我的查看代码: if request.method == 'POST': form = ExportStudentscsv(request.POST) if form.is_valid(): data = form.cleaned_data #get course from dropdown

这件事让我挠头太久了。就这样-

我正在尝试将一个用户模型类导出为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)
我遵循了这篇文章第三个答案中给出的方法,但没有运气。我没有在这里进行数据验证更改-

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文件中

在同一篇文章的第二个答案中,作者给出了一个创建新工作簿并使用BytesIO下载更改的示例。我想知道是否可以将这种方法用于使用BytesIO的现有工作簿

我也尝试过使用OpenPyXl库来完成这项任务,因为结果也不太可能。我在这里找到了一篇使用OpenPyXl的文章,我发现了一件有趣的事情

from openpyxl.writer.excel import save_virtual_workbook
我想知道有没有类似的东西,比如为xlsxwriter库保存虚拟工作簿,这样我就可以像

response = HttpResponse(content=save_virtual_workbook(workbook), mimetype='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet')
有人能帮我解决这个问题吗?

我想应该是response['Content-Type',而不是response['Content\u-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,我想应该是response['Content-Type',而不是response['Content\u-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

使用BytesIO和sheetwork.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)

使用BytesIO和sheetwork.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)
不推荐使用“保存虚拟”工作簿

您应该将python的tempfile.NamedTempFile类与BytesIO一起使用

Python管理NamedTemporaryFile文件的自动清理

阅读:文件

不推荐使用“保存虚拟”工作簿

您应该将python的tempfile.NamedTempFile类与BytesIO一起使用

Python管理NamedTemporaryFile文件的自动清理


阅读:文档

您没有将工作簿编写给销售代表。那么我应该如何下载它?您没有将工作簿编写给销售代表。那么我应该如何下载它?谢谢编辑后的答案。。但是,我想知道XLWT工作簿是否像在xlsxwriter工作簿=xlsxwriter.Workbookresponse中那样接受响应,{'in_memory':True}是否可以使用XLWT添加数据验证类型列表?如果是,你能给我举个例子吗。我找不到XLWT的任何适当文档。谢谢编辑后的答案。。但是,我想知道XLWT工作簿是否像在xlsxwriter工作簿=xlsxwriter.Workbookresponse中那样接受响应,{'in_memory':True}是否可以使用XLWT添加数据验证类型列表?如果是,你能给我举个例子吗。我找不到XLWT的任何适当文档