Я пытаюсь преобразовать файл 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.


Создайте файл импорта, используя приведенную ниже команду.
php artisan make:import TestImport
Внутри TestImport внесите такие изменения:
пространство имен App\Imports;
используйте Приложение\Пользователь; используйте иллюминацию\поддержку\коллекцию; используйте Maatwebsite\Excel\Concerns\ToCollection;
класс TestImport реализует ToCollection { коллекция публичных функций (коллекция $rows) { вернуть $строки; } }
В контроллере внесите такие изменения:
// исходный код: $rows = Excel::import(new TestImport, 'test.xlsx');
$rows = Excel::toCollection(новый TestImport, 'test.xlsx');
Я думаю, что метод load больше не используется в версии 3. Я получаю сообщение об ошибке Call to undefined method Maatwebsite\Excel\Excel::load()
проверьте выше еще раз.
моя проблема заключается в том, чтобы получить массив в контроллере, а не в TestImport
Ответ снова изменился, это может решить вашу проблему.
Спасибо за ваш ответ, я очень ценю вашу самоотверженность, но, к сожалению, ваш ответ не сработал для меня, я делюсь своим ответом, который сработал для меня.
Этот код не работает как ожидающий; если я пытаюсь получить доступ к $row[0], я получаю эту ошибку: Невозможно использовать объект типа Maatwebsite\Excel\Excel как массив
Приведенный выше код возвращает коллекцию Laravel, если вы вызываете $rows = Excel::toCollection(new TestImport, 'test.xlsx'); в контроллере
Вы должны попробовать это:
$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()",
@NikleshRaut: Пожалуйста, посмотрите этот ссылка на сайт
@NikleshRaut: Да, что-то в этом роде
К сожалению, я знал об этом, поэтому я попросил здесь версию 3
@NikleshRaut: Хорошо
Спасибо за ваш ответ, я делюсь своим ответом, который сработал для меня.
Это для версии 2, Laravel Excel версии 3 полностью отличается от предыдущей версии.
Я и @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/…
Вот как я этого добился:
В моем классе 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(новый импорт курса, запрос()->файл('курс'));
Есть ли способ оптимизировать toArray(). В случае, если у нас есть, скажем, 20 тысяч записей в нашем запросе?
Итак, эта функция
toArrayпришла из это документы. Я видел это, но не понял. позвольте мне проверить ваш ответ.