Как получить Excel в массив на сайте maatwebsite

Я пытаюсь преобразовать файл Excel в массив, используя последнюю версию Laravel-Excel ( 3.1.9)

Приведенный ниже код загрузит файл:

return Excel::download(new SalesOrderExport('columns'),'test.xlsx')

Но мне нужно преобразовать его, чтобы получить только массив. Я не хочу сейчас хранить эти данные Excel в базе данных.

Я попытался использовать приведенный ниже код, но это не сработало, поскольку метод load недоступен в версии 3.

Excel::load($request->file('sampledata'), function ($reader) {
    return response()->json($reader);
});

Поделитесь, пожалуйста, своими мыслями о том, как получить массив из Excel.


person Niklesh Raut    schedule 27.02.2019    source источник


Ответы (7)


Я добавляю его в надежде, что кто-то сможет найти для этого другие решения. Версия - "maatwebsite/excel": "^3.1"

В Controller

$data = Excel::toArray(new UsersImport(), $request->file);

В UsersImport

<?php
    namespace App\Imports;
    use Illuminate\Support\Collection;
    use Maatwebsite\Excel\Concerns\ToCollection;

    class UsersImport implements ToCollection
    {
       public function collection(Collection $rows)
       {
       }
    }

Результат массива Json

array:2 [▼
  0 => array:2 [▼
           0 => "+126785XXXXX"
           1 => "Jhon"
       ]
  1 => array:2 [▼
           0 => "+126784XXXXX"
           1 => "Doe"
       ]
  ]

И еще один бонус. Теперь предположим, что вам просто нужны номера телефонов, а затем создайте собственный массив из них в контроллере.

$data = Excel::toArray(new UsersImport(), $request->file);
$phoneNumbersData= [];
foreach ($data[0] as $key => $value) {
  $phoneNumbersData[] = $value[0];
}
return $phoneNumbersData;

Надеюсь, это кому-то поможет.

person Maniruzzaman Akash    schedule 06.10.2020
comment
большое спасибо, приятель. Ты спас мне день. - person Prajakta Pawar; 01.06.2021

Вот несколько рабочих примеров, основанных на импорте файла csv с использованием обычного элемента ввода файла. В моем случае после загрузки файл доступен через объект запроса как «csv_file».

public function importCSV(Request $request)
{
    // Get the csv rows as an array
    $theArray = Excel::toArray(new stdClass(), $request->file('csv_file'));

    // Get the csv rows as a collection
    $theCollection = Excel::toCollection(collect([]), $request->file('csv_file'));

    //etc
}
person omarjebari    schedule 26.03.2021

Вот как я этого добился:

В моем классе UsersImport: пространство имен App \ Imports;

use App\User;
use Maatwebsite\Excel\Concerns\ToModel;
use Maatwebsite\Excel\Concerns\Importable;

class UsersImport implements ToModel
{
    use Importable;

    public function model(array $row)
    {
        return new User([
           'id' => $row[0]
        ]);
    }
}

И в контроллере:

$imported_users = (new UsersImport)->toArray(request()->file('excel_file'))[0];

Надеюсь, это тебе поможет.

person Community    schedule 13.03.2019

Я пробовал что-то подобное, и это отлично сработало; в вашем файле импорта сделайте это

use Illuminate\Support\Collection;
use Maatwebsite\Excel\Concerns\ToCollection;

public function collection(Collection $row)
{
    return $row;
}

Затем сделайте это в контроллере;

$row = Excel::toCollection(new CourseImport, request()->file('course'));
person David Okeworo    schedule 20.04.2021
comment
поскольку вы упомянули массив, пожалуйста, используйте toArray () вместо toCollection (), как это; $ row = Excel :: toArray (новый CourseImport, request () - ›file ('course')); - person David Okeworo; 20.04.2021

  1. Создайте файл импорта, используя команду ниже.

    php artisan make: импорт TestImport

  2. Внутри TestImport внесите такие изменения:

    пространство имен App \ Imports;

    используйте App \ User; используйте Illuminate \ Support \ Collection; используйте Maatwebsite \ Excel \ Concerns \ ToCollection;

    класс TestImport реализует ToCollection {коллекция общедоступных функций (Collection $ rows) {return $ rows; }}

  3. В контроллере внесите такие изменения:

    // исходный код: $ rows = Excel :: import (new TestImport, 'test.xlsx');

    $ rows = Excel :: toCollection (новый TestImport, 'test.xlsx');

person narayansharma91    schedule 27.02.2019
comment
хорошо, так что эта toArray функция взята из в этой документации Я видел это, но не понял. позвольте мне проверить ваш ответ. - person Niklesh Raut; 27.02.2019
comment
Я думаю, что load метода больше нет в версии 3 Я получаю сообщение об ошибке Call to undefined method Maatwebsite\Excel\Excel::load() - person Niklesh Raut; 27.02.2019
comment
проверьте выше еще раз. - person narayansharma91; 27.02.2019
comment
моя проблема - получить массив в контроллере не в TestImport - person Niklesh Raut; 27.02.2019
comment
Ответ снова изменился, это может решить вашу проблему. - person narayansharma91; 27.02.2019
comment
Спасибо за ваш ответ, я очень ценю вашу преданность делу, но, к сожалению, ваш ответ не сработал для меня, я делюсь своим ответом, который сработал для меня. - person Niklesh Raut; 27.02.2019
comment
Этот код работает не так, как ожидалось; если я пытаюсь получить доступ к $ row [0], я получаю эту ошибку: невозможно использовать объект типа Maatwebsite \ Excel \ Excel как массив - person iosifv; 18.06.2020
comment
Приведенный выше код возвращает коллекцию Laravel, если вы вызываете $ rows = Excel :: toCollection (new TestImport, 'test.xlsx'); в контроллере - person brianlmerritt; 12.01.2021

Вы должны попробовать это:

$data = Excel::load($request->file('sampledata'), function ($reader) use($table) {
        $data = $reader->toArray();
        //here data has all excel data in array.
});
person AddWeb Solution Pvt Ltd    schedule 27.02.2019
comment
Я получаю эту ошибку "message": "Call to undefined method Maatwebsite\\Excel\\Excel::load()", - person Niklesh Raut; 27.02.2019
comment
@NikleshRaut: см. Эту ссылку - person AddWeb Solution Pvt Ltd; 27.02.2019
comment
@NikleshRaut: Да что-то в этом роде - person AddWeb Solution Pvt Ltd; 27.02.2019
comment
к сожалению, я знал об этом, поэтому я попросил здесь версию 3 - person Niklesh Raut; 27.02.2019
comment
@NikleshRaut: Хорошо - person AddWeb Solution Pvt Ltd; 27.02.2019
comment
Спасибо за ответ, я поделюсь своим ответом, который сработал для меня. - person Niklesh Raut; 27.02.2019
comment
Это для версии 2, Laravel Excel Version 3 полностью отличается от предыдущей версии. - person Maniruzzaman Akash; 06.10.2020

person    schedule
comment
Возможно ты можешь помочь мне. Посмотрите на это: stackoverflow.com/questions/56522035/ - person Success Man; 13.06.2019