我有如下结构表: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:
像这样保存在表中的数据:
答案 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');