当前位置: 首页 > news >正文

Excel导入日期变数字,数据库入库异常的排查与修复过程

📌【Bug记录】Excel导入日期变数字,数据库入库异常的排查与修复过程

📖 一、背景

最近在做一个功能:将 Excel 中的用户信息批量导入数据库,其中包含用户的出生日期字段,最初数据库表的 birth_date 字段类型是 varchar,打算直接把 1995/07/07 这种格式存进去。

开发环境:

  • 数据库:MySQL 8.x
  • Java 后端:Spring Boot + MyBatis-Plus
  • Excel导入库:Apache POI

📖 二、问题描述

在导入过程中,发现原本 Excel 中 1995/07/07 的日期,导入数据库之后变成了 277336 这样的数字。起初以为是导入逻辑出了问题,排查发现其实是 Excel 内部存储日期的机制导致的序列值问题

📖 三、原因分析

Excel 中的日期本质上是从 1900/01/01 起算的天数序列值,比如:

  • 1900/01/011
  • 1995/07/07277336

当我们使用 Apache POI 读取 Excel 时:

  • 如果单元格是日期格式,POI 读取到的类型是 NUMERIC,且是序列值
  • 如果不做日期判断和转换,直接当字符串或数字写入数据库,就会把这个序列值存进去

⚠️ 原先数据库字段是 varchar 类型,导致这类数据没做类型约束,直接把数字存进去了。

📖 四、解决方案

📝 方法一:调整数据库字段类型(我最终采用的方法)

birth_date 字段的类型由 varchar 改为 date 类型:

ALTER TABLE user_info
MODIFY COLUMN birth_date DATE COMMENT '出生日期';

这样,后续导入时,Apache POI 读取到日期格式,可以直接转成 java.util.Date,然后插入数据库 date 类型字段,不再出现序列值异常。

📝 方法二:代码层判断日期类型,转成字符串再入库

如果仍想保留 varchar 类型,也可以在导入代码中判断单元格类型:

if (cell.getCellType() == CellType.NUMERIC && DateUtil.isCellDateFormatted(cell)) {Date date = cell.getDateCellValue();SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");String dateStr = sdf.format(date);// 入库 dateStr
}
📝 方法三:导入前调整 Excel 格式

让 Excel 中的日期列先转成文本格式:

  1. 选中列
  2. 右键 → 设置单元格格式 → 选择“文本”
  3. 确认保存

这样导入时,读取到的就是字符串了。

📖 五、总结

📌 这次问题让我彻底搞清楚了 Excel 日期存储的底层原理,也顺便优化了数据库设计。

✅ 建议:

  • 日期类型字段,数据库中统一用 datedatetime 类型,避免后期字符串难以统一格式或做日期运算
  • 导入 Excel 时,一定要判断单元格类型,尤其是 CellType.NUMERICDateUtil.isCellDateFormatted 的情况

问题记录就是成长!
👊 希望这篇 bug 修复记录能帮到有同样困扰的朋友们。


http://www.xdnf.cn/news/467533.html

相关文章:

  • 【iOS】alloc的实际流程
  • 【办公类-100-01】20250515手机导出教学照片,自动上传csdn+最大化、最小化Vs界面
  • AD PCB板logo及二维码放置
  • Linux基础 -- 在内存中使用chroot修复eMMC
  • 非加密散列算法的应用-MurmurHash
  • 【Java】Spring IoC中的相关注解
  • 关于mysql分区键
  • Web GIS可视化地图框架Leaflet、OpenLayers、Mapbox、Cesium、ArcGis for JavaScript
  • 5.15本日总结
  • docker 命令操作大全
  • 【Matlab】最新版2025a发布,深色模式、Copilot编程助手上线!
  • redis中key的过期和淘汰
  • PDA手持终端应用有哪些?
  • Python生成器:高效处理大数据的秘密武器
  • YOLO11解决方案之距离计算探索
  • RHCE实验:通过脚本判断用户是否存在
  • 与entity物体的交互
  • 提升MySQL运维效率的AI利器:NineData深度评测与使用指南
  • 网页渲染的两条赛道
  • 语音识别——语音转文字
  • 20250515通过以太网让VLC拉取视熙科技的机芯的rtsp视频流的步骤
  • Spring Boot 拦截器:解锁5大实用场景
  • QImage高效率像素操作的方法
  • 基于windows环境Oracle主备切换之后OGG同步进程恢复
  • 兰亭妙微B端UI设计:融合多元风格,点亮品牌魅力
  • 嵌软面试每日一阅----通信协议篇(二)之TCP
  • 一招解决Tailwindcss4.x与其他库样式冲突问题
  • 报销单业务笔记
  • 中国近代史2
  • 深度学习框架对比---Pytorch和TensorFlow