简体   繁体   中英

Import profile (birth date) from excel file to MySQL

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:

enter image description here

Data saved in table like this:

enter image description here

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM