Laravel-excel: [FRAGE] Wie werden Daten von der implementierten Importmethode zurückgegeben?

Erstellt am 3. Jan. 2019  ·  10Kommentare  ·  Quelle: Maatwebsite/Laravel-Excel

Voraussetzungen

Versionen

  • PHP-Version: 7.2
  • Laravel-Version: 5.6
  • Paketversion: 3.1

Beschreibung

Ich frage mich nur, ob es eine Möglichkeit gibt, über die implementierte Importmethode mit meinem Controller zu kommunizieren. Ich habe versucht, ein Datenarray an den Controller zurückzugeben, aber es kommt nicht durch. Ich habe keine Erwähnung davon gesehen ...

Ich weiß, dass ich toCollection verwenden und den gesamten Import in eine Sammlung im Controller zurückgeben kann, habe aber Angst, einen Leistungseinbruch zu erzielen.

question

Hilfreichster Kommentar

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

Alle 10 Kommentare

Fügen Sie die importierten Daten in eine Klasseneigenschaft Ihres Importobjekts ein und erstellen Sie einen Getter dafür, den Sie aufrufen können, nachdem der Import in Ihrem Controller abgeschlossen wurde.

Mir muss noch etwas fehlen, lassen Sie mich etwas genauer werden.

Hier ist mein Importaufruf in meinem Controller:
$import = Excel::import(new SalesImport, 'imports/salesdata.xlsx');

class SalesImport implements ToCollection
{
    public function collection(Collection $rows)
    {
        .... lots of other stuff ....
        $this->data = $data;
    }

Mir ist klar, dass diese Daten nicht zu meinem $ import-Objekt im Controller zurückkehren, aber ich vermute, ich muss hier etwas anderes als ToCollection implementieren?

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

Genial!

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

Können Sie dies bitte unter https://docs.laravel-excel.com/3.1/imports/collection.html oder an einer anderen Stelle in der Dokumentation festlegen? Ich habe viel Zeit verloren, um das zu suchen.

Ein ähnliches Beispiel ist seit einiger Zeit in den Dokumenten enthalten: https://docs.laravel-excel.com/3.1/architecture/objects.html#getters

Hervorragende Bibliothek, dieses Beispiel eignet sich hervorragend für ein einzelnes Blatt.
Irgendwelche Tipps zur Implementierung mit WithMultipleSheets-Import? Wie soll ich die Zeilenanzahl erhalten?

Auf der CRUD erhalte ich: Aufruf der undefinierten Methode MaatwebsiteExcelExcel :: getRowCount ()

Ich benutze eine Klasse, um den Import des Specfic Sheet aufzurufen:

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

In der ExcelSampleImport-Klasse habe ich den in den Dokumenten angegebenen Zähler implementiert.

Wie kann ich das aber mit mehreren Blättern machen?

Klasse importieren

class CommunityImport implements WithMultipleSheets
{   
    use WithConditionalSheets;

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

Klasse für das erste Blatt

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++;
        }
    }    
}

Page Controller - Wie kann ich über die FirstSheetCommunityImport-Klasse auf die ID zugreifen?

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

Der Zugriff auf diese ID über die FirstSheetCommunityClass war ein Problem für mich, aber ich habe den Laravel-Cache verwendet, um meine Sammlung 10 Minuten lang zu speichern und dann über die Cache-Fassade vom Controller aus darauf zuzugreifen

Hier ist meine Einstellung zu Gettern mit mehreren Blättern. Die Verwendung des Cache ist meiner Meinung nach keine gute Idee ...

<?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);
    } 
    // ...
War diese Seite hilfreich?
0 / 5 - 0 Bewertungen