将配置文件(出生日期)从Excel文件导入MySQL

时间:2018-10-29 15:28:48

标签: php import yii2 phpexcel

我有如下结构表:name varchar(15),gender smallint(1),birth_date date()。

控制器:

public function actionImport()
{
    $profile = new Profile();

            $inputFile = 'files/profile.xlsx';
            try{
                $inputFileType = \PHPExcel_IOFactory::identify($inputFile);
                $objReader = \PHPExcel_IOFactory::createReader($inputFileType);
                $objPHPExcel = $objReader->load($inputFile);

            }catch(Exception $e){
                die('error');
            }

            $sheet = $objPHPExcel->getSheet(0);
            $highestRow = $sheet->getHighestRow();
            $highestColumn = $sheet->getHighestColumn();

            for($row = 1; $row <= $highestRow; $row++)
            {
                $rowData = $sheet->rangeToArray('A'.$row.':'.$highestColumn.$row, Null, TRUE, FALSE);

                if($row == 1){
                    continue;
                }

                $profile->name = $rowData[0][0];
                $profile->gender = $rowData[0][1];
                $profile->birth_date = $rowData[0][2];
                $profile->save();

            }

}

文件:profile.xlsx enter image description here

数据导入成功,但birth_date仍在注册。

我尝试这样显示print_r:

enter image description here

像这样保存在表中的数据:

enter image description here

2 个答案:

答案 0 :(得分:0)

  

取决于图像,您尝试将int编号保存在日期中   字段...这样错误就消失了。...

要解决此问题,您需要像Y-m-d这样将日期更改为日期,例如:1991-11-20,这是MySQL日期格式,或者如果需要,您需要将MySQL字段类型更改为int。将此号码保存在数据库中。

在PHP中:

echo date('Y-m-d');

您可以通过以下方式从UNIX转换日期:

    $unixtime = 1307595105;
echo $time = date("Y-m-d", $unixtime);

例如:

$profile->birth_date = date("Y-m-d", ($rowData[0][2] - 25569) * 86400);

OR

$profile->birth_date = date('Y-m-d', PHPExcel_Shared_Date::ExcelToPHP($rowData[0][2]));

答案 1 :(得分:0)

在包含日期的字段上的getValue()调用应返回类似41959 ....的值,即基于自1900年1月1日(或1904年1月1日)以来的天数的MS Excel序列化日期时间戳记(如果文件是使用Mac版的MS Excel创建的),并且(默认情况下)rangeToArray()使用getValue()调用。

要获取格式化的日期字符串,您需要调用getFormattedValue();然后,PHPExcel使用该单元格的数字格式掩码来根据该掩码设置日期格式。您可以通过将rangeToArray()参数设置为true来设置$formatData为您完成此操作。

$rowData = $sheet->rangeToArray('A'.$row.':'.$highestColumn.$row, Null, TRUE, TRUE);

这将格式化Excel本身在电子表格中显示的所有单元格。

或者,PHPExcel确实提供了在Excel时间戳和Unix时间戳或PHP DateTime对象之间转换日期值的函数,您可以改用这些函数:

$profile->birth_date = PHPExcel_Shared_Date::ExcelToPHPObject($rowData[0][2])
    ->format('Y-m-d');