xiaoyi
2026-11-02 68317d44b233f28150336bbf3aa3a32400552437
分支
用户 xiaoyi <908147524@qq.com>
星期一, 十一月 2, 2026 11:02 +0800
提交者 xiaoyi <908147524@qq.com>
星期一, 十一月 2, 2026 11:02 +0800
提交68317d44b233f28150336bbf3aa3a32400552437
目录 ace6d2a4b2068c340aac635865fc92204545c052 目录 | zip | gz
上一版本 e3fcc27bfdb23999a2ce1bcf718cd98062cdd870 查看 | 对比
fix(excel): 导入模板日期改为文本显示,修复显示为 Excel 序列号

## 问题
22 个导入模板的日期列显示为 Excel 序列号,使用者看不懂该填什么格式:
员工入职日期 43891.0
员工合同签订日 46023.0
考勤打卡时间 46037.354166666664

## 排查过程
1. 先尝试注册自定义 LocalDate/LocalDateTime 转换器 —— 无效。
原因:FastExcel 内置同名转换器(cn.idev.excel.converters.localdate.LocalDateStringConverter),
写出时优先命中内置的 Number 转换器,自定义转换器不生效。
2. 最终改用 CellWriteHandler:单元格写完后介入,
读取 context.getOriginalValue(),把 LocalDate/LocalDateTime 格式化成文本写入。

## 实现
新增 DateAsTextCellWriteHandler:
- afterCellDispose 里拦截,跳过表头行
- LocalDate -> yyyy-MM-dd
- LocalDateTime -> yyyy-MM-dd HH:mm:ss
- java.util.Date -> yyyy-MM-dd
- cell.setCellType(STRING) + setCellValue(text)

ExcelUtils 新增 writeTemplate 方法(专用模板写出):
- 注册 DateAsTextCellWriteHandler
- 22 个 Controller 的 importTemplate 全部改用 writeTemplate
- 导入解析仍走 ExcelUtils.read,不受影响

## 顺带修复模板示例数据
- 用户:部门编号改为部门名称(取真实部门)
- 部门:上级部门改为真实根部门(原「总公司」不存在)
- 员工:部门/岗位取真实数据(原「研发部」不存在)
- 客户:示例改为「示例客户A/B(请替换)」(原「超级管理员」「源码」是芋道 demo)
- MDM物料:分类编码/单位编码补真实值(原为空,必填项)

## 验证(本地实测)
22 个模板逐一检查,日期序列号 0 个:
员工入职日期 2020-03-01 出生 1990-01-15
员工合同 2026-01-01 ~ 2028-12-31
考勤日期 2026-01-15 08:30:00
已添加3个文件
已修改24个文件
305 ■■■■■ 文件已修改
yudao-framework/yudao-spring-boot-starter-excel/src/main/java/cn/iocoder/yudao/framework/excel/core/convert/LocalDateStringConverter.java 40 ●●●●● 对比 | 查看 | 原始文档 | blame | 历史
yudao-framework/yudao-spring-boot-starter-excel/src/main/java/cn/iocoder/yudao/framework/excel/core/convert/LocalDateTimeStringConverter.java 37 ●●●●● 对比 | 查看 | 原始文档 | blame | 历史
yudao-framework/yudao-spring-boot-starter-excel/src/main/java/cn/iocoder/yudao/framework/excel/core/handler/DateAsTextCellWriteHandler.java 58 ●●●●● 对比 | 查看 | 原始文档 | blame | 历史
yudao-framework/yudao-spring-boot-starter-excel/src/main/java/cn/iocoder/yudao/framework/excel/core/util/ExcelUtils.java 29 ●●●●● 对比 | 查看 | 原始文档 | blame | 历史
yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contract/CrmContractController.java 2 ●●●●● 对比 | 查看 | 原始文档 | blame | 历史
yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/CrmCustomerController.java 16 ●●●●● 对比 | 查看 | 原始文档 | blame | 历史
yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/invoice/CrmInvoiceController.java 2 ●●●●● 对比 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/purchase/ErpPurchaseOrderController.java 2 ●●●●● 对比 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/purchase/ErpPurchaseRequestController.java 2 ●●●●● 对比 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/sale/ErpSaleOrderController.java 2 ●●●●● 对比 | 查看 | 原始文档 | blame | 历史
yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/controller/admin/attendance/HrmAttendanceRecordController.java 2 ●●●●● 对比 | 查看 | 原始文档 | blame | 历史
yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/controller/admin/employee/HrmEmployeeContractController.java 2 ●●●●● 对比 | 查看 | 原始文档 | blame | 历史
yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/controller/admin/employee/HrmEmployeeController.java 20 ●●●●● 对比 | 查看 | 原始文档 | blame | 历史
yudao-module-mdm/src/main/java/cn/iocoder/yudao/module/mdm/controller/admin/item/MdmItemController.java 33 ●●●●● 对比 | 查看 | 原始文档 | blame | 历史
yudao-module-mdm/src/main/java/cn/iocoder/yudao/module/mdm/controller/admin/unit/MdmUnitMeasureController.java 2 ●●●●● 对比 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/dv/machinery/MesDvMachineryController.java 2 ●●●●● 对比 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/dv/metering/MesDvMeteringController.java 2 ●●●●● 对比 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/md/item/MesMdItemTypeController.java 2 ●●●●● 对比 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/ipqc/MesQcIpqcController.java 2 ●●●●● 对比 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/iqc/MesQcIqcController.java 2 ●●●●● 对比 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/oqc/MesQcOqcController.java 2 ●●●●● 对比 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/materialstock/MesWmMaterialStockController.java 2 ●●●●● 对比 | 查看 | 原始文档 | blame | 历史
yudao-module-srm/src/main/java/cn/iocoder/yudao/module/srm/controller/admin/supplier/SrmSupplierController.java 2 ●●●●● 对比 | 查看 | 原始文档 | blame | 历史
yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dept/DeptController.java 16 ●●●●● 对比 | 查看 | 原始文档 | blame | 历史
yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dept/PostController.java 2 ●●●●● 对比 | 查看 | 原始文档 | blame | 历史
yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/UserController.java 2 ●●●●● 对比 | 查看 | 原始文档 | blame | 历史
yudao-module-system/src/test/java/cn/iocoder/yudao/module/system/service/user/AdminUserServiceImplTest.java 20 ●●●●● 对比 | 查看 | 原始文档 | blame | 历史