Python保存XLS文件后日期变数字,如何用JS转回日期格式?
解决Excel日期序列号转标准日期格式问题
问题原因
你看到的44992是Excel的日期序列号——Excel以1900年1月1日为起始日,用整数表示距离该日期的天数(注意Excel存在1900年闰年bug,错误地包含了不存在的1900年2月29日)。你的Python脚本在处理表格时,没有保留日期格式,导致日期被转成了原始序列号。
方法1:JavaScript中直接转换序列号
以下是直接在JS中将Excel序列号转为mm/dd/yyyy格式的函数,已处理Excel的1900闰年bug:
function excelSerialToDate(excelSerial) { // Excel起始日到Unix纪元(1970-01-01)的天数差 const epochOffset = 25569; let days = excelSerial - epochOffset; // 修正Excel的1900闰年bug:序列号>=60时,实际多算了1天 if (excelSerial >= 60) { days -= 1; } // 转换为JS Date对象(单位:毫秒) const date = new Date(days * 86400000); // 格式化为mm/dd/yyyy const month = String(date.getMonth() + 1).padStart(2, '0'); const day = String(date.getDate()).padStart(2, '0'); const year = date.getFullYear(); return `${month}/${day}/${year}`; } // 测试:44992对应原日期07/03/2023 console.log(excelSerialToDate(44992)); // 输出 "07/03/2023"
方法2:在Python处理阶段避免日期转序列号
既然问题出在Python修改列名的环节,建议直接在Python读取和保存时保留日期格式,避免后续转换:
import xlrd from xlutils.copy import copy from datetime import datetime # 读取原始表格(保留格式信息) rb = xlrd.open_workbook("original.xls", formatting_info=True) wb = copy(rb) ws = wb.get_sheet(0) # 获取第一个工作表 # 遍历所有单元格,识别并转换日期 source_sheet = rb.sheet_by_index(0) for row in range(source_sheet.nrows): for col in range(source_sheet.ncols): cell = source_sheet.cell(row, col) # 判断是否为日期类型单元格 if cell.ctype == xlrd.XL_CELL_DATE: # 转换为datetime对象 date_val = xlrd.xldate_as_datetime(cell.value, rb.datemode) # 格式化为mm/dd/yyyy字符串写入 ws.write(row, col, date_val.strftime("%m/%d/%Y")) else: # 非日期单元格直接写入原值 ws.write(row, col, cell.value) # 保存修改后的表格 wb.save("modified.xls")
这样处理后,保存的表格中日期会以字符串形式保留mm/dd/yyyy格式,不会出现序列号问题。
内容的提问来源于stack exchange,提问作者Gordon Maloney
相关产品推荐
相关产品推荐

