Как получить массив 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.

Преобразование HTML-таблицы в профессиональный документ Excel
Преобразование HTML-таблицы в профессиональный документ Excel
Это самый простой способ создания Excel из HTML-таблицы.
Импорт excel в laravel в базу данных
Импорт excel в laravel в базу данных
Здравствуйте, дорогой читатель, в этой статье я расскажу практическим и быстрым способом, как импортировать файл Excel в вашу базу данных с помощью...
7
0
30 040
7
Перейти к ответу Данный вопрос помечен как решенный

Ответы 7

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

    php artisan make:import TestImport

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

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

    используйте Приложение\Пользователь; используйте иллюминацию\поддержку\коллекцию; используйте Maatwebsite\Excel\Concerns\ToCollection;

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

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

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

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

Итак, эта функция toArray пришла из это документы. Я видел это, но не понял. позвольте мне проверить ваш ответ.

Niklesh Raut 27.02.2019 11:18

Я думаю, что метод load больше не используется в версии 3. Я получаю сообщение об ошибке Call to undefined method Maatwebsite\Excel\Excel::load()

Niklesh Raut 27.02.2019 11:30

проверьте выше еще раз.

narayansharma91 27.02.2019 11:47

моя проблема заключается в том, чтобы получить массив в контроллере, а не в TestImport

Niklesh Raut 27.02.2019 12:42

Ответ снова изменился, это может решить вашу проблему.

narayansharma91 27.02.2019 12:54

Спасибо за ваш ответ, я очень ценю вашу самоотверженность, но, к сожалению, ваш ответ не сработал для меня, я делюсь своим ответом, который сработал для меня.

Niklesh Raut 27.02.2019 14:29

Этот код не работает как ожидающий; если я пытаюсь получить доступ к $row[0], я получаю эту ошибку: Невозможно использовать объект типа Maatwebsite\Excel\Excel как массив

iosifv 18.06.2020 02:59

Приведенный выше код возвращает коллекцию Laravel, если вы вызываете $rows = Excel::toCollection(new TestImport, 'test.xlsx'); в контроллере

brianlmerritt 12.01.2021 06:51

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

$data = Excel::load($request->file('sampledata'), function ($reader) use($table) {
        $data = $reader->toArray();
        //here data has all excel data in array.
});

Я получаю эту ошибку "message": "Call to undefined method Maatwebsite\\Excel\\Excel::load()",

Niklesh Raut 27.02.2019 11:55

@NikleshRaut: Пожалуйста, посмотрите этот ссылка на сайт

AddWeb Solution Pvt Ltd 27.02.2019 12:25

@NikleshRaut: Да, что-то в этом роде

AddWeb Solution Pvt Ltd 27.02.2019 12:29

К сожалению, я знал об этом, поэтому я попросил здесь версию 3

Niklesh Raut 27.02.2019 12:40

@NikleshRaut: Хорошо

AddWeb Solution Pvt Ltd 27.02.2019 12:41

Спасибо за ваш ответ, я делюсь своим ответом, который сработал для меня.

Niklesh Raut 27.02.2019 14:30

Это для версии 2, Laravel Excel версии 3 полностью отличается от предыдущей версии.

Maniruzzaman Akash 06.10.2020 22:59
Ответ принят как подходящий

Я и @narayan очень старались превратить запрошенный файл excel в массив. Теперь я могу правильно получить массив с кодом ниже

$rows = Excel::toArray(new SalesOrderImport, $request->file('sampledata')); 

В моем классе SalesOrderExport у меня есть только функция по умолчанию, которая требуется как абстрактный метод.

namespace App\Exports;

use App\SalesOrder;
use Maatwebsite\Excel\Concerns\FromCollection;

class SalesOrderExport implements FromCollection
{
    public function collection()
    {   
        return SalesOrder::all();
    }
}

Мой код контроллера

public function importTest(Request $request)
{
    $rows = Excel::toArray(new SalesOrderImport, $request->file('sampledata'));
    return response()->json(["rows"=>$rows]);
}

И в HTML

<input class = "" type = "file" name = "sampledata" id = "sampledata">

Я уже создал этот экспорт

php artisan make:import SalesOrder

Прикрепление связанных изображений

Возможно ты можешь помочь мне. Посмотрите на это: stackoverflow.com/questions/56522035/…

Success Man 13.06.2019 07:37

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

В моем классе 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];

Я надеюсь, что это поможет вам.

Я добавляю это в надежде, что кто-то сможет найти для этого другое решение. Версия - "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;

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

Вот несколько рабочих примеров, основанных на импорте 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
}

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

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

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

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

$row = Excel::toCollection(new CourseImport, request()->file('course'));

поскольку вы упомянули массив, пожалуйста, используйте toArray() вместо toCollection() следующим образом; $row = Excel::toArray(новый импорт курса, запрос()->файл('курс'));

David Okeworo 20.04.2021 18:54

Есть ли способ оптимизировать toArray(). В случае, если у нас есть, скажем, 20 тысяч записей в нашем запросе?

Anurag 10.09.2021 13:19

Другие вопросы по теме