Laravel-excel: [سؤال] كيف يتم إرجاع البيانات من طريقة الاستيراد المطبقة؟

تم إنشاؤها على ٣ يناير ٢٠١٩  ·  10تعليقات  ·  مصدر: Maatwebsite/Laravel-Excel

المتطلبات الأساسية

إصدارات

  • إصدار PHP: 7.2
  • إصدار Laravel: 5.6
  • إصدار الحزمة: 3.1.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;
    }

من الواضح لي أن هذه البيانات لا تجعلها تعود إلى كائن الاستيراد $ الخاص بي في وحدة التحكم ، لكني أعتقد أنني بحاجة إلى تطبيق شيء آخر غير 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 دقائق ثم الوصول إليها من وحدة التحكم باستخدام واجهة ذاكرة التخزين المؤقت

هنا هو رأيي في الحصول على أوراق متعددة. استخدام ذاكرة التخزين المؤقت لهذا ليس فكرة جيدة في رأيي ...

<?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 التقييمات