【发布时间】:2019-04-19 15:58:33
【问题描述】:
我在 Django 视图中有一个查询集:
queryset = CourseTeacher.objects.filter(cls__uuid__in=uuidlist).annotate(teacher_fullname=Concat('teacher__name', V(' '), 'teacher__surname'))
有些字符会导致 UnicodeDecodeError 异常。Teacher_fullname 或 teacher_surname 可能有这些字符。因此它给出以下警告:
异常类型:UnicodeDecodeError 异常值:
“ascii”编解码器无法解码位置 12 中的字节 0xc3:序数不在范围内(128)无法编码/解码的字符串是:John ��。易
我正在尝试将此字符串写入 Excel 工作表,如下所示:
worksheet.write(teachersrow, item['teacher_fullname'].encode('utf-8'), cellformat)
.encode('utf-8') 似乎没有解决问题
使用 Django 1.9.5 和 Python 2.7.5
完整的追溯是:
Traceback:
File "/home/myproject/Env/myproject/lib/python2.7/site-packages/django/core/handlers/base.py" in get_response
149. response = self.process_exception_by_middleware(e, request)
File "/home/myproject/Env/myproject/lib/python2.7/site-packages/django/core/handlers/base.py" in get_response
147. response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/home/myproject/Env/myproject/lib/python2.7/site-packages/django/contrib/auth/decorators.py" in _wrapped_view
23. return view_func(request, *args, **kwargs)
File "/home/myproject/Env/myproject/lib/python2.7/site-packages/django/contrib/auth/decorators.py" in _wrapped_view
23. return view_func(request, *args, **kwargs)
File "/home/myproject/Env/myproject/lib/python2.7/site-packages/django/contrib/auth/decorators.py" in _wrapped_view
23. return view_func(request, *args, **kwargs)
File "/home/myproject/Env/myproject/lib/python2.7/site-packages/django/contrib/auth/decorators.py" in _wrapped_view
23. return view_func(request, *args, **kwargs)
File "./college/views.py" in print_course_teacher
1341. workbook.close()
File "/home/myproject/Env/myproject/lib/python2.7/site-packages/xlsxwriter/workbook.py" in close
306. self._store_workbook()
File "/home/myproject/Env/myproject/lib/python2.7/site-packages/xlsxwriter/workbook.py" in _store_workbook
649. xml_files = packager._create_package()
File "/home/myproject/Env/myproject/lib/python2.7/site-packages/xlsxwriter/packager.py" in _create_package
140. self._write_shared_strings_file()
File "/home/myproject/Env/myproject/lib/python2.7/site-packages/xlsxwriter/packager.py" in _write_shared_strings_file
287. sst._assemble_xml_file()
File "/home/myproject/Env/myproject/lib/python2.7/site-packages/xlsxwriter/sharedstrings.py" in _assemble_xml_file
54. self._write_sst_strings()
File "/home/myproject/Env/myproject/lib/python2.7/site-packages/xlsxwriter/sharedstrings.py" in _write_sst_strings
84. self._write_si(string)
File "/home/myproject/Env/myproject/lib/python2.7/site-packages/xlsxwriter/sharedstrings.py" in _write_si
122. self._xml_si_element(string, attributes)
File "/home/myproject/Env/myproject/lib/python2.7/site-packages/xlsxwriter/xmlwriter.py" in _xml_si_element
122. self.fh.write("""<si><t%s>%s</t></si>""" % (attr, string))
File "/home/myproject/Env/myproject/lib64/python2.7/codecs.py" in write
691. return self.writer.write(data)
File "/home/myproject/Env/myproject/lib64/python2.7/codecs.py" in write
351. data, consumed = self.encode(object, self.errors)
Exception Type: UnicodeDecodeError at /print-course-teacher/
Exception Value: 'ascii' codec can't decode byte 0xc3 in position 12: ordinal not in range(128)
原代码为:
worksheet.write(teachersrow, item['teacher_fullname'], cellformat)
在上下文中查看代码:
uuidlist = []
for classuuid in optional_class_object:
uuidlist.append(classuuid['uuid'])
queryset = CourseTeacher.objects.filter(cls__uuid__in=uuidlist).annotate(teacher_fullname=Concat('teacher__name', V(' '), 'teacher__surname')) | CourseTeacher.objects.filter(cls__uuid=cls_uuid).annotate(teacher_fullname=Concat('teacher__name', V(' '), 'teacher__surname')).order_by("cls__name")
last_semester = "2017-2018"
workbook = xlsxwriter.Workbook('table.xlsx')
worksheet = workbook.add_worksheet()
worksheet.write("A2", "Semester [ "+str(last_semester)+" ] ")
cellformat = workbook.add_format({
'border': 1,
'align': 'left',
'valign': 'top',
'fg_color': 'white'})
row = 4
for item in queryset.values('cls__year', 'cls__name', 'course__code', 'course__name', 'teacher_fullname', 'credit', 'hours_weekly').reverse():
classrow = "A"+str(row)
coursecoderow = "B"+str(row)
coursenamerow = "C"+str(row)
creditrow = "D"+str(row)
hoursweeklyrow = "E"+str(row)
teachersrow = "F"+str(row)
worksheet.write(classrow, str(item['cls__year'])+""+item['cls__name'], cellformat)
worksheet.write(coursecoderow, item['course__code'].encode('utf-8'), cellformat)
worksheet.write(coursenamerow, item['course__name'].encode('utf-8'), cellformat)
worksheet.write(creditrow, item['credit'], cellformat)
worksheet.write(hoursweeklyrow, item['hours_weekly'], cellformat)
worksheet.write(teachersrow, item['teacher_fullname'].encode('utf-8'), cellformat)
row = row + 1
workbook.close()
with open("table.xlsx", 'rb') as fh:
response = HttpResponse(fh.read(), content_type="application/vnd.ms-excel")
response['Content-Disposition'] = 'inline; filename=' + os.path.basename("table.xlsx")
os.remove("table.xlsx")
return response
【问题讨论】:
-
请在添加
encode之前显示完整的回溯以及您最初尝试的代码。 -
我在添加编码之前添加了完整的回溯和代码
-
我使用的是 Centos 7. Python 2.7.5
-
嗯,这应该可以。您能否在上下文中显示该代码,从您创建工作表和查询集的位置?
-
在上下文中添加代码
标签: python django django-views django-queryset