使用tablib将数据集导出到Excel文件时如何保留日期格式?
问题原因
Excel中的日期本质是从1900年1月1日开始计数的数值序列,日常看到的11/23/2007这类格式只是单元格的显示样式。tablib默认导出xls文件时不会给日期类型单元格自动设置对应显示格式,因此会直接展示底层的数值序列。
解决方案
方案1:转为文本格式日期(操作最简单)
导出前将datetime对象格式化为和原文件一致的字符串,导出后显示效果和原文件完全一致:
from datetime import datetime # 替换为你实际的日期列列名 date_col_name = "你的日期列名" date_col_idx = headers.index(date_col_name) # 遍历处理所有行的日期列 for row in new_dataset: date_val = row[date_col_idx] if isinstance(date_val, datetime): # 格式化为原格式的字符串 row[date_col_idx] = date_val.strftime("%m/%d/%Y") # 执行原有导出逻辑即可 with open('output-2.xls', 'wb') as f: new_dataset.headers = headers f.write(new_dataset.export('xls'))
注意:该方案导出的日期为文本格式,无法直接在Excel中做日期类的运算筛选
方案2:保留原生日期格式(支持Excel日期运算)
如果需要导出的日期是Excel可识别的原生格式,不使用tablib的默认导出方法,改用其底层依赖的xlwt库手动设置单元格格式:
import xlwt from datetime import datetime # 初始化工作簿和工作表 wb = xlwt.Workbook() ws = wb.add_sheet("Sheet1") # 定义要使用的日期显示格式 date_style = xlwt.easyxf(num_format_str="MM/DD/YYYY") # 写入表头 for col_idx, header in enumerate(headers): ws.write(0, col_idx, header) # 写入数据 date_col_idx = headers.index("你的日期列名") for row_idx, row in enumerate(new_dataset, start=1): for col_idx, cell_val in enumerate(row): # 日期列用指定格式写入 if col_idx == date_col_idx and isinstance(cell_val, datetime): ws.write(row_idx, col_idx, cell_val, date_style) else: ws.write(row_idx, col_idx, cell_val) # 保存文件 wb.save("output-2.xls")
内容的提问来源于stack exchange,提问作者Oussama He
相关产品推荐
相关产品推荐

