Импортировать профиль (дату рождения) из файла Excel в MySQL - PullRequest
0 голосов
/ 29 октября 2018

У меня есть таблица структуры, такая как: имя varchar (15), пол smallint (1), дата рождения ().

Контроллер:

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 введите описание изображения здесь

Импорт данных успешно выполнен, но дата рождения все еще зарегистрирована.

Я пытаюсь напечатать print_r так:

введите описание изображения здесь

Данные сохраняются в таблице следующим образом:

введите описание изображения здесь

Ответы [ 2 ]

0 голосов
/ 30 октября 2018

A getValue() вызов в поле, содержащее дату, должен возвращать значение, подобное 41959 .... то есть сериализованную отметку даты и времени MS Excel, основанную на количестве дней с 1 января 1900 года (или 1 января 1904 года, если файл был создан с использованием версии MS Excel для Mac), и (по умолчанию) rangeToArray() использует вызов getValue().

Чтобы получить отформатированную строку даты, вам нужно вместо этого вызвать getFormattedValue(); PHPExcel затем использует маску числового формата для этой ячейки, чтобы отформатировать дату в соответствии с этой маской. Вы можете установить rangeToArray(), чтобы сделать это для вас, установив для аргумента $formatData значение true.

$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');
0 голосов
/ 30 октября 2018

Зависимость вашего изображения, вы пытаетесь сохранить номер 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);

ИЛИ

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