Laravel-excel: [ВОПРОС] Как вернуть данные из реализованного метода импорта?

Созданный на 3 янв. 2019  ·  10Комментарии  ·  Источник: Maatwebsite/Laravel-Excel

Предпосылки

Версии

  • Версия PHP: 7.2
  • Версия Laravel: 5.6
  • Версия пакета: 3.1

Описание

Мне просто интересно, есть ли способ связаться с моим контроллером из реализованного метода импорта. Я попытался вернуть массив данных в контроллер, но ничего не вышло. Не видел ни одного упоминания об этом ...

Я знаю, что могу использовать toCollection и вернуть весь импорт в коллекцию в контроллере, но беспокоюсь о снижении производительности.

question

Самый полезный комментарий

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

Все 10 Комментарий

Поместите импортированные данные в свойство класса вашего объекта импорта и создайте для него геттер, который вы можете вызвать после завершения импорта в вашем контроллере.

Я, должно быть, что-то упускаю, позвольте мне уточнить.

Итак, вот мой вызов импорта в моем контроллере:
$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);
    } 
    // ...
Была ли эта страница полезной?
0 / 5 - 0 рейтинги