Laravel-excel: [PREGUNTA] ¿Cómo devolver datos del método de importación implementado?

Creado en 3 ene. 2019  ·  10Comentarios  ·  Fuente: Maatwebsite/Laravel-Excel

Prerrequisitos

Versiones

  • Versión de PHP: 7.2
  • Versión de Laravel: 5.6
  • Versión del paquete: 3.1

Descripción

Me pregunto si hay alguna forma de comunicarme con mi controlador desde el método de importación implementado. Intenté devolver una matriz de datos al controlador, pero no está llegando. No he visto ninguna mención de esto ...

Sé que puedo usar toCollection y devolver la importación completa a una colección en el controlador, pero me preocupa perder el rendimiento.

question

Comentario más útil

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 comentarios

Coloque los datos importados en una propiedad de clase de su objeto de importación y cree un captador al que pueda llamar después de que la importación haya terminado en su controlador.

Todavía debo estar perdiendo algo, déjame ser un poco más específico.

Así que aquí está mi llamada de importación en mi 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;
    }

Para mí está claro que estos datos no regresan a mi objeto $ import en el controlador, pero supongo que necesito implementar algo más que ToCollection aquí.

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

¡Impresionante!

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

¿Puede establecer eso en https://docs.laravel-excel.com/3.1/imports/collection.html o en otro lugar de la documentación? Perdí mucho tiempo buscando eso.

Un ejemplo similar ha estado en los documentos por un tiempo: https://docs.laravel-excel.com/3.1/architecture/objects.html#getters

Gran biblioteca, este ejemplo funciona muy bien para una sola hoja.
¿Algún consejo sobre la implementación con la importación WithMultipleSheets? ¿Cómo debo obtener el recuento de filas?

En el CRUD obtengo: llamada al método indefinido MaatwebsiteExcelExcel :: getRowCount ()

Estoy usando una clase para llamar al importador de hojas específicas:

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

En la clase ExcelSampleImport, he implementado el contador como se especifica en los documentos.

¿Cómo puedo hacer esto pero con varias hojas?

Importar clase

class CommunityImport implements WithMultipleSheets
{   
    use WithConditionalSheets;

    public function conditionalSheets(): array
    {
        return [
            0 => new FirstSheetCommunityImport(),
            1 => new SecondSheetCommunityImport(),
        ];
    }   
}

Clase para la primera hoja

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: ¿cómo puedo acceder a la identificación desde la clase FirstSheetCommunityImport?

public function import()
     {
    $import = new CommunityImport();
    $import->onlySheets(0);
        Excel::import($import, storage_path('app/xls/').'comunidad-import.xlsx');
     } 

Acceder a esa identificación desde FirstSheetCommunityClass fue un problema para mí, pero usé la caché de Laravel para almacenar mi colección durante 10 minutos y luego acceder a ella desde el controlador usando Cache Facade

Aquí está mi opinión sobre captadores con varias hojas. Usar caché para esto no es una buena idea en mi opinión ...

<?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);
    } 
    // ...
¿Fue útil esta página
0 / 5 - 0 calificaciones