Как правильно сделать импорт xls в yii2?

Пользователь

от kurt , в категории: PHP , 2 года назад

Как правильно сделать импорт xls в yii2?

Facebook Vk Ok Twitter LinkedIn Telegram Whatsapp

2 ответа

Пользователь

от camren , год назад

@kurt 

Для импорта XLS в Yii2 необходимо выполнить следующие действия:

  1. Установить библиотеку phpoffice/phpexcel: composer require phpoffice/phpexcel.
  2. Создать модель, отвечающую за импорт данных. Например:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
 false],
        ];
    }

    public function import()
    {
        $inputFileName = $this->file->tempName;
        $inputFileType = IOFactory::identify($inputFileName);
        $reader = IOFactory::createReader($inputFileType);
        $spreadsheet = $reader->load($inputFileName);

        // здесь можно выполнить обработку данных
        // например, прочитать данные из первого листа

        $worksheet = $spreadsheet->getActiveSheet();
        $highestRow = $worksheet->getHighestRow();
        $highestColumn = $worksheet->getHighestColumn();

        $data = [];
        for ($row = 1; $row <= $highestRow; ++$row) {
            $rowData = [];
            for ($col = 'A'; $col <= $highestColumn; ++$col) {
                $cellValue = $worksheet->getCell($col . $row)->getValue();
                $rowData[] = $cellValue;
            }
            $data[] = $rowData;
        }

        return $data;
    }
}


  1. Создать экшн в контроллере, который будет обрабатывать отправленную форму и вызывать метод модели для импорта данных. Например:
1
2
3
4
5
6
7
8
9
load(Yii::$app->request->post()) && $model->validate()) {
            $data = $model->import();
            // здесь можно сохранить данные в базу данных или вывести на экран
            var_dump($data);
        }

        return $this->render('xls-import', ['model' => $model]);
    }
}


  1. Создать форму для отправки файла XLS. Например:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
title = 'XLS Import';
$this->params['breadcrumbs'][] = $this->title;
?>

title) ?>

 ['enctype' => 'multipart/form-data']]); ?>

field($model, 'file')->fileInput() ?>


     'btn btn-primary']) ?>




  1. Создать маршрут для экшна в конфигурации приложения. Например:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
return [
    // ...
    'components' => [
        // ...
    ],
    'controllerMap' => [
        'site' => [
            'class' => 'appcontrollersSiteController',
        ],
    ],
    'defaultRoute' => 'site/xls-import',
];


После выполнения этих шагов, пользователь сможет выбрать файл XLS, отправить его на сервер и выполнить импорт данных. В методе модели можно выполнять любую обработку данных, в зависимости от требований проекта.

Пользователь

от rebekah , 5 месяцев назад

@kurt 

Дополнительно к предыдущему ответу, нужно учитывать, что библиотека PHPExcel больше не поддерживается и рекомендуется использовать библиотеку PhpSpreadsheet вместо нее. Для использования PhpSpreadsheet можно установить через Composer:

1
composer require phpoffice/phpspreadsheet


Затем, в модели для импорта данных необходимо использовать пространство имен и классы PhpSpreadsheet:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
use PhpOfficePhpSpreadsheetIOFactory;

class ExcelImport
{
    // Метод import для импорта данных из xls файла
    public function import($inputFileName)
    {
        $inputFileType = IOFactory::identify($inputFileName);
        $reader = IOFactory::createReader($inputFileType);
        $spreadsheet = $reader->load($inputFileName);

        $worksheet = $spreadsheet->getActiveSheet();
        $highestRow = $worksheet->getHighestRow();
        $highestColumn = $worksheet->getHighestColumn();

        $data = [];
        for ($row = 1; $row <= $highestRow; ++$row) {
            $rowData = [];
            for ($col = 'A'; $col <= $highestColumn; ++$col) {
                $cellValue = $worksheet->getCell($col . $row)->getValue();
                $rowData[] = $cellValue;
            }
            $data[] = $rowData;
        }

        return $data;
    }
}


Остальные шаги (создание экшна в контроллере, формы и маршрута) остаются теми же, как было описано в предыдущем ответе. Главное, перед использованием класса из библиотеки PhpSpreadsheet, убедитесь, что вы правильно настроили пространства имен и используете правильные классы для операций с файлами Excel.