You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解决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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 17:37:44