Как проверить, действительна ли первая строка или столбцы файла Excel в Laravel Excel?

Я пытаюсь проверить, имеет ли загруженный пользователем файл excel правильные столбцы / первую строку / атрибуты перед чтением в другие строки. Я использую Laravel 4 с MaatWebsite Laravel Excel.

Я создал функцию, которая позволяет пользователям обновлять таблицу сотрудников в базе данных системы, импортировав файл Excel.

Теперь правильный файл Excel имеет, скажем, 3 столбца: firstname, lastname и username. Если в файле Excel есть все эти атрибуты / столбцы, я теперь буду читать каждую из следующих строк и проверять каждую строку, что на самом деле не является частью моей проблемы на данный момент.

Но если какой-либо из трех атрибутов / столбцов отсутствует в файле Excel, я проигнорирую запрос и верну ошибку.

Я пробовал использовать это, которое получает атрибут lastname:

$sample = Excel::selectSheetsByIndex(0)->load($readFile, function($reader){})->get(array("lastname"));

Но даже несмотря на то, что lastname не был найден, $ sample по-прежнему не равно нулю, поэтому я не смогу проверить, присутствует lastname или нет.

Как я могу проверить наличие / отсутствие атрибутов / столбцов?

ОБНОВЛЕНИЕ:

Выбранный мною ответ будет работать отлично, если в первой строке после строки атрибутов будут все необходимые атрибуты. Например: если в нем есть значения для firstname, lastname и username.

Но если в случаях, когда значение first name (или любое значение attritbute в этом отношении) первой строки без атрибутов (строка атрибутов, относящаяся к именам столбцов) отсутствует, предоставленный сценарий вернет false, даже если в файле Excel есть все атрибуты firstname, lastname и username.

Итак, я изменил сценарий на это:

  1. Сначала я прочитал файл Excel. Я также объявил логическую переменную, чтобы отмечать, действителен ли файл Excel или нет.

$excelChecker = Excel::selectSheetsByIndex(0)->load('path/to/file', function($reader){})->get()->toArray();

$excelIsValid = false;
  1. Затем я просматриваю все результаты и проверяю, все ли требуемые значения (firstname, lastname и username) установлены или присутствуют хотя бы один раз.

    foreach($excelChecker as $ex){
    
        if(isset($ex["lastname"]) && isset($ex["firstname"]) && isset($ex["username"])){
             $excelIsValid = true;
       }
    }
    

Пояснение:

Если $excelIsValid по-прежнему false в конце цикла, значит, файл ни разу не имел всех требуемых атрибутов. Это либо означает, что файл пуст, имеет неправильные имена атрибутов или не имеет допустимой строки. Короче говоря, файл недействителен и его не должно быть в системе.


person christianleroy    schedule 25.09.2014    source источник


Ответы (2)


Я подготовил этот пример сценария:

Route::get('/', function() {

    $isError = false;

    Excel::load('file.xls', function($reader) use (&$isError) {

        $firstrow = $reader->first()->toArray();

        if (isset($firstrow['firstname']) && isset($firstrow['lastname']) && isset($firstrow['username'])) {
            $rows = $reader->all();
            foreach ($rows as $row) {
                echo $row->firstname.' '.$row->lastname.' '.$row->username."<br />";
            }
        }
        else {
            $isError = true;

        }

    });
    if ($isError) {
        return View::make('error');
    }
});

Скрипт загружает файл и проверяет наличие нужных столбцов. Он не проверяет, есть ли еще столбцы - конечно, если вы хотите, вы можете добавить проверку exta - count($firstow) == 3. Если есть ошибка, он устанавливает $isError в true и в маршруте отображает шаблон.

person Marcin Nabiałek    schedule 25.09.2014
comment
Я думаю, что метод first () автоматически получит строку после первой строки (строка атрибутов). Я думаю, что сценарий будет работать идеально, только если первая строка после строки атрибутов верна. - person christianleroy; 25.09.2014
comment
@prinzechristian Истинно, но атрибуты создаются автоматически из первой строки (строки атрибутов). Если атрибуты разные (например, вы измените firstname на firstname2 в столбце атрибутов Excel, первая строка данных также будет иметь другие столбцы, и firstname не будет установлен - person Marcin Nabiałek; 25.09.2014
comment
@ Nabilek, в этом есть смысл. Спасибо! - person christianleroy; 25.09.2014

В Laravel Excel 3.1 вы можете использовать

        public function import()
        {
            $column= (new HeadingRowImport)->toArray('users.xlsx');

            if (isset($column['firstname']) && isset($column['lastname']) &&  isset($column['username'])) {
                 //dd('columns found');
                 //your code
            }else{
                //dd('columns not found');
                //if not found show error or something
            }

        }

Вы можете делать что угодно внутри этого, если еще, или вы можете использовать свою логику

person Pushkraj Jori    schedule 20.04.2021