Мне просто интересно, есть ли способ связаться с моим контроллером из реализованного метода импорта. Я попытался вернуть массив данных в контроллер, но ничего не вышло. Не видел ни одного упоминания об этом ...
Я знаю, что могу использовать toCollection и вернуть весь импорт в коллекцию в контроллере, но беспокоюсь о снижении производительности.
Поместите импортированные данные в свойство класса вашего объекта импорта и создайте для него геттер, который вы можете вызвать после завершения импорта в вашем контроллере.
Я, должно быть, что-то упускаю, позвольте мне уточнить.
Итак, вот мой вызов импорта в моем контроллере:
$import = Excel::import(new SalesImport, 'imports/salesdata.xlsx');
class SalesImport implements ToCollection
{
public function collection(Collection $rows)
{
.... lots of other stuff ....
$this->data = $data;
}
Мне ясно, что эти данные не возвращаются к моему объекту $ import в контроллере, но я предполагаю, что мне нужно реализовать здесь что-то другое, кроме ToCollection?
class SalesImport implements ToCollection
{
public $data;
public function collection(Collection $rows)
{
.... lots of other stuff ....
$this->data = $data;
}
$import = new SalesImport;
Excel::import($import, 'imports/salesdata.xlsx');
dd($import->data);
class SalesImport implements ToCollection { public $data; public function collection(Collection $rows) { .... lots of other stuff .... $this->data = $data; }
$import = new SalesImport; Excel::import($import, 'imports/salesdata.xlsx'); dd($import->data);
Потрясающие!
class SalesImport implements ToCollection { public $data; public function collection(Collection $rows) { .... lots of other stuff .... $this->data = $data; }
$import = new SalesImport; Excel::import($import, 'imports/salesdata.xlsx'); dd($import->data);
Не могли бы вы установить это в https://docs.laravel-excel.com/3.1/imports/collection.html или в другом месте в документации? Я потерял много времени на поиски этого.
Подобный пример некоторое время был в документации: https://docs.laravel-excel.com/3.1/architecture/objects.html#getters
Отличная библиотека, этот пример отлично подходит для одного листа.
Есть какие-нибудь советы по реализации импорта WithMultipleSheets? Как мне узнать количество строк?
В CRUD я получаю: вызов неопределенного метода MaatwebsiteExcelExcel :: getRowCount ()
Я использую класс для вызова импортера спецификаций:
class ExcelSampleSheetsImport implements WithMultipleSheets
{
protected $params;
public function __construct($params)
{
$this->params = $params;
}
public function sheets(): array
{
return [
'Sheet to import' => new ExcelSampleImport($this->params)
];
}
}
В классе ExcelSampleImport я реализовал счетчик, как указано в документации.
Как я могу это сделать, но с несколькими листами?
Класс импорта
class CommunityImport implements WithMultipleSheets
{
use WithConditionalSheets;
public function conditionalSheets(): array
{
return [
0 => new FirstSheetCommunityImport(),
1 => new SecondSheetCommunityImport(),
];
}
}
Класс для первого листа
class FirstSheetCommunityImport implements ToCollection
{
public $id;
public function collection(Collection $rows)
{
$i=0;
foreach ($rows as $row)
{
if($i==0){
$this->id = $row[0];
}
$i++;
}
}
}
Контроллер страницы - как получить доступ к идентификатору из класса FirstSheetCommunityImport?
public function import()
{
$import = new CommunityImport();
$import->onlySheets(0);
Excel::import($import, storage_path('app/xls/').'comunidad-import.xlsx');
}
Для меня было проблемой получить доступ к этому идентификатору из FirstSheetCommunityClass, но я использовал кеш Laravel для хранения моей коллекции в течение 10 минут, а затем получил доступ к ней с контроллера с помощью Cache Facade.
Вот мой взгляд на геттеры с несколькими листами. На мой взгляд, использование кеша для этого - не лучшая идея ...
<?php
// VendorsExtraDataImportSheet.php:
use Illuminate\Support\Collection;
use Maatwebsite\Excel\Concerns\ToCollection;
class VendorsExtraDataImportSheet implements ToCollection
{
public $count = 0;
public function collection(Collection $rows)
{
$this->count++;
}
}
<?php
// VendorsExtraDataImport.php
use Illuminate\Support\Collection;
use Maatwebsite\Excel\Concerns\ToCollection;
use Maatwebsite\Excel\Concerns\WithConditionalSheets;
use Maatwebsite\Excel\Concerns\WithMultipleSheets;
class VendorsExtraDataImport implements ToCollection, WithMultipleSheets
{
use WithConditionalSheets;
public const SHEET_TO_IMPORT = 'Example data input';
public $sheet;
public function collection(Collection $rows)
{
}
public function conditionalSheets(): array
{
if (!$this->sheet) {
$this->sheet = new VendorsExtraDataImportSheet;
}
return [
self::SHEET_TO_IMPORT => $this->sheet,
];
}
}
<?php
// ...
// PageController.php
public function import()
{
$import = new VendorsExtraDataImport();
$import->onlySheets(VendorsExtraDataImport::SHEET_TO_IMPORT);
Excel::import($import, resource_path('data/vendors.xlsx'));
dd($import->sheet->count);
}
// ...
Самый полезный комментарий