“姜戈,python,django,django-rest-framework"/>

首页 > 解决方案 > 预期的“姜戈

问题描述

我正在创建一个 API 来从 django 模型获取数据到 excel 工作表。

这样做时,我收到了标题中提到的错误。

模型.py

class Task(models.Model):

    Id=models.IntegerField()
    Name=models.CharField(max_length=50,null=False,blank=True)
    Image1=models.FileField(blank=True, default="",
     upload_to="media/images",null=True)
    Image2=models.FileField(blank=True, default="",
     upload_to="media/images",null=True)
    Date=models.DateField(null=True,blank=True)
    
    def __str__(self):
        return str(self.Name)

视图.py

class TaskViewSet(viewsets.ViewSet):

    def list(self,request):

        try:
            queryset=Task.objects.all()
            response = HttpResponse(content_type='application/ms-excel')
            response['Content-Disposition'] = 'attachment; filename="users.xls'
            wb = openpyxl.Workbook()
            ws = wb.active
            ws.title = "Your Title"

            row_num=0
            columns=['Id','Name','Image1','Image2','Date']

            for col_num in range(len(columns)):
                c = ws.cell(row=row_num + 1, column=col_num + 1)
                c.value = columns[col_num][0]
                ws.column_dimensions[get_column_letter(col_num + 1)].width = columns[col_num][1]
            for obj in queryset:
                row_num += 1
                row = [
                    obj.Id,
                    obj.Name,
                    obj.Image1,
                    obj.Image2,
                    obj.Date,
                ]
                for col_num in range(len(row)):
                    c = ws.cell(row=row_num + 1, column=col_num + 1)
                    c.value = row[col_num]
            
            wb.save(response)
            return response
        
        except Exception as error:
            traceback.print_exc()
            return Response({"message": str(error), "success": False}, status=status.HTTP_200_OK)

追溯:

Traceback (most recent call last):
  File "/home/ashu/Desktop/django/task/office/views.py", line 54, in list
    ws.column_dimensions[get_column_letter(col_num + 1)].width = columns[col_num][1]
  File "/home/ashu/Desktop/django/venv/lib/python3.6/site-packages/openpyxl/descriptors/base.py", line 67, in __set__
    value = _convert(self.expected_type, value)
  File "/home/ashu/Desktop/django/venv/lib/python3.6/site-packages/openpyxl/descriptors/base.py", line 57, in _convert
    raise TypeError('expected ' + str(expected_type))
TypeError: expected <class 'float'>

标签: pythondjangodjango-rest-framework

解决方案


这行代码似乎是错误的:

ws.column_dimensions[get_column_letter(col_num + 1)].width = columns[col_num][1]

你定义了

columns = ['Id','Name','Image1','Image2','Date']

所以该部分columns[col_num][1]将返回单个字符(columns[col_num]是一个字符串,并[1]从该字符串返回第二个字符。)

ws.column_dimensions[get_column_letter(col_num + 1)].width应该是浮点数,而不是字符串/字符。


推荐阅读