Só estou me perguntando se há alguma maneira de me comunicar com meu controlador a partir do método de importação implementado. Tentei retornar um array de dados ao controlador, mas não conseguiu. Não vi nenhuma menção disso ...
Eu sei que posso usar toCollection e retornar a importação inteira para uma coleção no controlador, mas estou preocupado em ter um impacto no desempenho.
Coloque os dados importados em uma propriedade de classe de seu objeto de importação e faça um getter para ele que você possa chamar depois que a importação terminar em seu controlador.
Eu ainda devo estar faltando alguma coisa, deixe-me ser um pouco mais específico.
Então, aqui está minha chamada de importação no meu controlador:
$import = Excel::import(new SalesImport, 'imports/salesdata.xlsx');
class SalesImport implements ToCollection
{
public function collection(Collection $rows)
{
.... lots of other stuff ....
$this->data = $data;
}
Está claro para mim que esses dados não estão retornando ao meu objeto $ import no controlador, mas estou supondo que preciso implementar algo diferente de ToCollection aqui?
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);
Impressionante!
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);
Você pode definir isso em https://docs.laravel-excel.com/3.1/imports/collection.html ou em outro lugar na documentação? Perdi muito tempo procurando isso.
Um exemplo semelhante está nos documentos há algum tempo: https://docs.laravel-excel.com/3.1/architecture/objects.html#getters
Ótima biblioteca, este exemplo funciona muito bem para uma única folha.
Alguma dica sobre como implementar com a importação WithMultipleSheets? Como devo obter a contagem de linhas?
No CRUD, estou recebendo: Chamada para o método indefinido MaatwebsiteExcelExcel :: getRowCount ()
Estou usando uma classe para chamar o importador da folha de especificações:
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)
];
}
}
Na classe ExcelSampleImport, implementei o contador conforme especificado nos documentos.
Como posso fazer isso, mas com várias folhas?
Classe de importação
class CommunityImport implements WithMultipleSheets
{
use WithConditionalSheets;
public function conditionalSheets(): array
{
return [
0 => new FirstSheetCommunityImport(),
1 => new SecondSheetCommunityImport(),
];
}
}
Aula para a primeira folha
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++;
}
}
}
Controlador de página - Como posso acessar o id da classe FirstSheetCommunityImport?
public function import()
{
$import = new CommunityImport();
$import->onlySheets(0);
Excel::import($import, storage_path('app/xls/').'comunidad-import.xlsx');
}
Acessar aquele id a partir da FirstSheetCommunityClass foi um problema para mim, mas usei o cache do Laravel para armazenar minha coleção por 10 minutos e depois acessar a partir do controlador usando a Cache Facade
Aqui está minha opinião sobre getters com várias planilhas. Usar cache para isso não é uma boa ideia na minha opinião ...
<?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);
}
// ...
Comentários muito úteis