I have structure table like: name varchar(15), gender smallint(1), birth_date date().
Controller:
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();
}
}
File: profile.xlsx enter image description here
Data import success, but birth_date still 0000-00-00.
I try to print_r display like this:
Data saved in table like this:
Dependence of your image, you try to save int number in date field...so that the error is gone....
To resolve issue, you need to change number to date like this Ymd
such as: 1991-11-20, this is MySQL date format, or you need to change MySQL field type to int if you need to save this number in database.
In PHP:
echo date('Y-m-d');
And you can convert date from unix by this:
$unixtime = 1307595105;
echo $time = date("Y-m-d", $unixtime);
for your example:
$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]));
A getValue()
call on a field containing a date should return a value like 41959.... that is, an MS Excel serialized datetime stamp based on the number of days since 1st January 1900 (or 1st January 1904 if the file was created using the Mac version of MS Excel), and (by default) rangeToArray()
uses a getValue()
call.
To get a formatted date string, you need to call getFormattedValue()
instead; and PHPExcel then uses the number format mask for that cell to format the date according to that mask. You can set rangeToArray()
to do this for you by setting the $formatData
argument to true.
$rowData = $sheet->rangeToArray('A'.$row.':'.$highestColumn.$row, Null, TRUE, TRUE);
This will format all cells as they appear in the spreadsheet in Excel itself.
Alternatively, PHPExcel does provide functions to convert date values between Excel timestamps and unix timestamps, or PHP DateTime objects, and you could use those instead:
$profile->birth_date = PHPExcel_Shared_Date::ExcelToPHPObject($rowData[0][2])
->format('Y-m-d');
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.