FastAdmin--实现导入Excel表时对日期数据进行格式转换

日期导入出错问题的原因

1、Excel中的日期和时间数据是以数值格式存储的,例如日期2018/8/12,实际上是以数值43324存储的。
2、FastAdmin的数据导入功能默认是不会对导入的数据进行数据转换处理的。
如果数据库要求输入的日期格式为YYYY/mm/dd,而程序从Excel表格中读取并导入数据库的日期为数值,这时候数据库就会报日期格式不正确的错误。

日期导入出错问题的解决办法

FastAdmin使用了PHPExcel来导入Excel表,PHPExcel自带了日期格式转换的功能。

<?php
   date("Y-m-d", \PHPExcel_Shared_Date::ExcelToPHP(43324));
/* 2018/8/12 */

如果不能对Excel表本身进行修改,那该怎么解决这个问题?
方法一,直接修改\app\admin\library\traits\Backend.php的import()方法,加上日期格式转换的代码。问题是这样会影响到全局。
方法二,在自己的控制器将上述的import()方法复制一遍再改写。但这样也不够简洁。
方法三,利用面向对象继承方面的知识,添加并修改少量代码,使得数据转换操作更加灵活。
1.给\app\admin\library\traits\Backend.php添加一个属性。

/*
 * 字段-数据转换函数 键值对数组
 */
protected $dataConversionFunMap = [];

2.给\app\admin\library\traits\Backend.php添加两个方法

/*
 * 设置 字段-数据转换函数 键值对数组
 */
protected function setDataConversionFunMap()
{
    $this->dataConversionFunMap = [];
}

/*
 * 数据转换
 */
private function dataConversion($fieldArr, $k, $v)
{
    $this->setDataConversionFunMap();
    if (isset($this->dataConversionFunMap)) {
        foreach ($this->dataConversionFunMap as $field => $dataConversionFun) {
            if ($fieldArr[$k] === $field) {
                return $dataConversionFun($v);
            } else {
                return $v;
            }
        }
    } else {
        return $v;
    }
}

3.修改\app\admin\library\traits\Backend.php的import()方法。将其中的
$row[$fieldArr[$k]] = $v;这一行改成$row[$fieldArr[$k]] = $this->dataConversion($fieldArr, $k, $v);

// 修改前
foreach ($temp as $k => $v) {
    if (isset($fieldArr[$k]) && $k !== '') {
        $row[$fieldArr[$k]] = $v;
    }
}

// 修改后
foreach ($temp as $k => $v) {
    if (isset($fieldArr[$k]) && $k !== '') {
        $row[$fieldArr[$k]] = $this->dataConversion($fieldArr, $k, $v);
    }
}

4.如何使用?
在自己的控制器中重写setDataConversionFunMap()方法。
假设要进行数据转换的字段为warehousing_date,将它和针对它进行数据转换处理的函数加入键值对数组。
这样导入Excel表时,我们设置的数据转换函数就会对字段为warehousing_date的数据进行处理
了。

/*
 * 设置 字段-数据转换函数 键值对数组
 */
protected function setDataConversionFunMap()
{
    $dataConversionFunMap['warehousing_date'] = function ($v) {
        if($v){
            return date("Y-m-d", \PHPExcel_Shared_Date::ExcelToPHP($v));
        }
        return date('Y-m-d');
    };
    $this->dataConversionFunMap = $dataConversionFunMap;
}
注:修改fastadmin代码前最好进行代码备份
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值