Laravel:如何转换导入Excel文件中单元格的日期值
解决Maatwebsite Excel导入时日期序列号转Y-m-d格式问题
你遇到的44950是Excel的日期序列号(对应1900日期系统下的2023-01-24),可以通过以下几种方式转换为Y-m-d格式:
方法一:结合PhpSpreadsheet与Carbon(Laravel推荐)
Maatwebsite Excel底层依赖PhpSpreadsheet,其Date类提供了序列号转DateTime对象的方法,配合Carbon可以快速格式化:
use Carbon\Carbon; use PhpOffice\PhpSpreadsheet\Shared\Date; public function model(array $row) { return new Event([ // 其他字段 'date' => Carbon::instance(Date::excelToDateTimeObject($row[1]))->format('Y-m-d'), ]); }
方法二:原生PHP DateTime处理
如果不需要Carbon,直接用PhpSpreadsheet和原生DateTime:
use PhpOffice\PhpSpreadsheet\Shared\Date; public function model(array $row) { $dateObj = Date::excelToDateTimeObject($row[1]); return new Event([ // 其他字段 'date' => $dateObj->format('Y-m-d'), ]); }
兼容CSV字符串日期与XLSX序列号
如果同时支持CSV(可能是d/m/Y格式的字符串)和XLSX(序列号),可以增加判断逻辑:
use Carbon\Carbon; use PhpOffice\PhpSpreadsheet\Shared\Date; public function model(array $row) { $rawDate = $row[1]; $formattedDate = ''; if (is_numeric($rawDate)) { // 处理XLSX的日期序列号 $formattedDate = Carbon::instance(Date::excelToDateTimeObject($rawDate))->format('Y-m-d'); } else { // 处理CSV的字符串日期(如24/01/2023) $formattedDate = Carbon::createFromFormat('d/m/Y', $rawDate)->format('Y-m-d'); } return new Event([ // 其他字段 'date' => $formattedDate, ]); }
内容的提问来源于stack exchange,提问作者AlphaRabid
相关产品推荐
相关产品推荐

