如何解决xlwt导出Excel时日期显示为数字、外键显示ID的问题
修复Django xlwt导出Excel的日期显示与外键字段问题
我来帮你搞定这两个导出时的小问题,分两步就能解决:
1. 让外键显示Type模型的名称而非ID
你当前用values_list('id_type')取出的是外键的ID值,要获取关联Type的名称,直接在values_list里用双下划线关联字段id_type__name就行。另外考虑到id_type可能为null,我们可以处理下空值避免导出异常。
2. 让日期显示为可读格式而非数字
Excel里的日期本质是序列化数字,xlwt需要我们指定日期格式的单元格样式,才能把数字解析成可读的日期字符串。
修改后的完整views.py代码:
import xlwt from django.http import HttpResponse from django.db.models import Coalesce from .models import Admission def export_users_xls(request): response = HttpResponse(content_type='application/ms-excel') response['Content-Disposition'] = 'attachment; filename="users.xls"' wb = xlwt.Workbook(encoding='utf-8') ws = wb.add_sheet('Admission') row_num = 0 # 表头样式 font_style = xlwt.XFStyle() font_style.font.bold = True # 可自定义表头文字,这里改成中文更直观 columns = ['日期', '证件类型', '姓名'] for col_num in range(len(columns)): ws.write(row_num, col_num, columns[col_num], font_style) # 普通内容样式 font_style = xlwt.XFStyle() # 创建日期专用样式,自定义显示格式 date_style = xlwt.XFStyle() date_style.num_format_str = 'YYYY-MM-DD' # 也可以改成'M/D/YYYY'这类格式 # 查询数据:取出日期、Type名称(空值替换为'无')、姓名 rows = Admission.objects.annotate( type_name=Coalesce('id_type__name', '无') ).values_list('date', 'type_name', 'name') for row in rows: row_num += 1 # 日期列应用专属样式 ws.write(row_num, 0, row[0], date_style) # 类型和姓名列用普通样式 ws.write(row_num, 1, row[1], font_style) ws.write(row_num, 2, row[2], font_style) wb.save(response) return response
关键修改点说明:
- 外键字段优化:用
annotate结合Coalesce获取Type名称,同时把null值替换为'无',避免导出空内容;如果不需要处理空值,也可以直接在values_list里写'id_type__name'。 - 日期格式处理:创建
date_style并设置num_format_str,写入日期单元格时应用这个样式,Excel就会正确解析并显示日期。 - 表头文字我改成了中文,你可以根据需求改回原英文。
这样导出的Excel就能正常显示可读日期和外键名称啦~
内容的提问来源于stack exchange,提问作者dev_beginer
相关产品推荐
相关产品推荐

