Laravel Maatwebsite Excel 导入时日期列为空的解决方案

轻墨酱_7139

轻墨酱_7139

2026-03-20

799人浏览

原创

Laravel Maatwebsite Excel 导入时日期列为空的解决方案

使用 Laravel Maatwebsite(v3.1)导入 Excel 时,若表头为 Date,该列常被识别为 null;根本原因在于 WithHeadingRow 与 Excel 内部日期格式解析冲突,需结合列索引映射、显式日期转换及格式预处理来解决。

使用 laravel maatwebsite(v3.1)导入 excel 时,若表头为 `date`,该列常被识别为 `null`;根本原因在于 `withheadingrow` 与 excel 内部日期格式解析冲突,需结合列索引映射、显式日期转换及格式预处理来解决。

在 Laravel 中通过 maatwebsite/excel(v3.1)导入 Excel 数据时,开发者常遇到一个典型问题:当 Excel 列标题为 Date(或其它 PHP/Excel 敏感关键词如 id、name、created_at 等),该列值在 $row 数组中始终为 null,即使单元格内容明确为有效日期(如 2024-03-15 或 Excel 序列号 44593)。这并非数据丢失,而是 WithHeadingRow 机制在解析带保留字表头时,与 PhpSpreadsheet 底层的类型推断逻辑发生冲突——尤其当 Excel 将日期存储为序列数值(如 44593 表示 2022-02-01)且未正确标记单元格格式时,Maatwebsite 默认无法将其安全转换为 Carbon 实例。

✅ 正确实践:禁用 WithHeadingRow + 显式索引映射 + 日期解析

首先,移除 WithHeadingRow 接口。它虽便于按标题取值,但在存在保留字表头或格式不一致的 Excel 中极易失效。改为基于列索引(0-based)精确映射:

<?php namespace App\Imports\Master;

use App\Models\Master\RiscoveryInsuranceSettlement;
use Maatwebsite\Excel\Concerns\Importable;
use Maatwebsite\Excel\Concerns\SkipsFailures;
use Maatwebsite\Excel\Concerns\ToModel;
use PhpOffice\PhpSpreadsheet\Shared\Date as PhpSpreadsheetDate;
use Carbon\Carbon;

class RiscoverySettlementImport implements ToModel
{
    use Importable, SkipsFailures;

    public function model(array $row)
    {
        // 假设 Excel 列顺序固定:A=insurance_company, B=policy_number, C=date, ...
        // 注意:$row[0] 对应第1列(A),$row[2] 对应第3列(C)即 Date 列
        $rawDate = $row[2] ?? null;

        // ✅ 关键:处理 Excel 日期序列号(如 44593)→ Carbon 实例
        $parsedDate = null;
        if ($rawDate !== null && is_numeric($rawDate)) {
            // PhpSpreadsheet 提供标准转换方法
            $excelTimestamp = (int) round($rawDate);
            if ($excelTimestamp > 0) {
                $parsedDate = Carbon::instance(PhpSpreadsheetDate::excelToDateTimeObject($excelTimestamp));
            }
        } elseif (is_string($rawDate) && !empty(trim($rawDate))) {
            // 尝试解析字符串日期(如 "2024-03-15", "15/03/2024")
            $parsedDate = Carbon::createFromFormat('Y-m-d', trim($rawDate))
                ?: Carbon::createFromFormat('d/m/Y', trim($rawDate))
                ?: Carbon::parse(trim($rawDate));
        }

        return new RiscoveryInsuranceSettlement([
            'insurance_company'   => $row[0] ?? null,
            'policy_number'       => $row[1] ?? null,
            'date'                => $parsedDate?->format('Y-m-d'), // 存入 DB 的标准格式
            'month'               => $row[3] ?? null, // 注意索引偏移
            'name_of_product'     => $row[4] ?? null,
            // ... 其他字段按实际列顺序填充
        ]);
    }
}

⚠️ 重要注意事项

  • 不要依赖 WithColumnFormatting + NumberFormat::FORMAT_DATE_YYYYMMDD:v3.1 中该配置对 WithHeadingRow 下的日期列无效,且易引发类型转换异常。
  • Excel 文件预处理建议:
    • 在 Excel 中右键日期列 →「设置单元格格式」→ 明确选择「日期」类型(非“常规”或“文本”);
    • 避免合并单元格、空行或隐藏列,确保首行为纯标题、第二行为真实数据;
    • 若可控制导出端,推荐将日期导出为 YYYY-MM-DD 字符串格式(文本型),规避序列号解析风险。
  • 调试技巧:在 model() 中 dd($row) 后,检查 date 对应索引的实际值类型(int, float, string),再决定解析路径。
  • 升级提示:maatwebsite/excel v3.1 已停止维护,新项目建议升级至 laravel-excel v4.x,其对日期自动解析和 WithHeadingRow 兼容性显著增强,并原生支持 WithCustomValueBinder 精细控制单元格读取逻辑。

通过弃用 WithHeadingRow、采用确定性列索引映射,并集成 PhpSpreadsheetDate::excelToDateTimeObject() 进行鲁棒日期转换,即可稳定解决 Date 列为 null 的问题,同时提升导入健壮性与可维护性。

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
php文件怎么打开
php文件怎么打开

打开php文件步骤:1、选择文本编辑器;2、在选择的文本编辑器中,创建一个新的文件,并将其保存为.php文件;3、在创建的PHP文件中,编写PHP代码;4、要在本地计算机上运行PHP文件,需要设置一个服务器环境;5、安装服务器环境后,需要将PHP文件放入服务器目录中;6、一旦将PHP文件放入服务器目录中,就可以通过浏览器来运行它。

2023.09.01

9864

6

php怎么取出数组的前几个元素
php怎么取出数组的前几个元素

取出php数组的前几个元素的方法有使用array_slice()函数、使用array_splice()函数、使用循环遍历、使用array_slice()函数和array_values()函数等。本专题为大家提供php数组相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.11

5881

5

php反序列化失败怎么办
php反序列化失败怎么办

php反序列化失败的解决办法检查序列化数据。检查类定义、检查错误日志、更新PHP版本和应用安全措施等。本专题为大家提供php反序列化相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.11

2075

5

php怎么连接mssql数据库
php怎么连接mssql数据库

连接方法:1、通过mssql_系列函数;2、通过sqlsrv_系列函数;3、通过odbc方式连接;4、通过PDO方式;5、通过COM方式连接。想了解php怎么连接mssql数据库的详细内容,可以访问下面的文章。

2023.10.23

3668

4

php连接mssql数据库的方法
php连接mssql数据库的方法

php连接mssql数据库的方法有使用PHP的MSSQL扩展、使用PDO等。想了解更多php连接mssql数据库相关内容,可以阅读本专题下面的文章。

2023.10.23

4374

6

html怎么上传
html怎么上传

html通过使用HTML表单、JavaScript和PHP上传。更多关于html的问题详细请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.03

3431

9

PHP出现乱码怎么解决
PHP出现乱码怎么解决

PHP出现乱码可以通过修改PHP文件头部的字符编码设置、检查PHP文件的编码格式、检查数据库连接设置和检查HTML页面的字符编码设置来解决。更多关于php乱码的问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.09

4877

8

php文件怎么在手机上打开
php文件怎么在手机上打开

php文件在手机上打开需要在手机上搭建一个能够运行php的服务器环境,并将php文件上传到服务器上。再在手机上的浏览器中输入服务器的IP地址或域名,加上php文件的路径,即可打开php文件并查看其内容。更多关于php相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.13

3822

8

sprintf函数用法详解
sprintf函数用法详解

sprintf函数的用法:1、格式化字符串;2、指定输出宽度和精度;3、返回值。更多关于sprintf函数用法详解的内容,大家可以阅读下面的文章。

2023.11.27

11802

4

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.6万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 133.4万人学习