Laravel-excel: [PERGUNTA] Como retornar dados do método de importação implementado?

Criado em 3 jan. 2019  ·  10Comentários  ·  Fonte: Maatwebsite/Laravel-Excel

Pré-requisitos

Versões

  • Versão PHP: 7.2
  • Versão do Laravel: 5.6
  • Versão do pacote: 3.1

Descrição

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.

question

Comentários muito úteis

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);

Todos 10 comentários

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);
    } 
    // ...
Esta página foi útil?
0 / 5 - 0 avaliações

Questões relacionadas

vandolphreyes picture vandolphreyes  ·  3Comentários

contifico picture contifico  ·  3Comentários

gamevnlc picture gamevnlc  ·  3Comentários

matthewslouismarie picture matthewslouismarie  ·  3Comentários

daraghoshea picture daraghoshea  ·  3Comentários