Laravel-excel: [سؤال] كيفية تخطي الصفوف الفارغة (3.1)

تم إنشاؤها على ٢٩ أكتوبر ٢٠١٨  ·  12تعليقات  ·  مصدر: Maatwebsite/Laravel-Excel

  • إصدار الحزمة: 3.1.1

وصف

كيف يمكن تخطي الصفوف الفارغة في المستند؟

more information needed

التعليق الأكثر فائدة

أهلا،
لقد حاولت استخدام $ row-> filter () -> isNotEmpty () ولكن نظرًا لحقيقة أنني أستخدم WithValidation ، تتوقف الرموز مع وجود خطأ في التحقق من الصحة. تبدو قواعدي كما يلي:

public function rules(): array { return [ 'name' => 'required', '*.name' => 'required', 'email' => 'required|email', '*.email' => 'required|email', 'discount' => 'nullable|numeric', '*.discount' => 'nullable|numeric', ]; }

لسوء الحظ ، إذا كان لديك ملف excel ، فاحذف محتوى بعض الصفوف في نهاية ملف Excel لا يزال Laravel-Excel يتعرف عليها على أنها ليست فارغة. ثم فشل التحقق من الصحة. أريد تخطي هذه الصفوف قبل التحقق من الصحة.

ال 12 كومينتر

شكرا لتقديم التذكرة. لسوء الحظ ، المعلومات التي قدمتها غير كاملة. نحتاج إلى معرفة الإصدار الذي تستخدمه وكيفية إعادة إنتاجه. الرجاء تضمين أمثلة التعليمات البرمجية. قبل أن نتمكن من استلامه ، يرجى مراجعة (https://github.com/Maatwebsite/Laravel-Excel/blob/3.0/.github/ISSUE_TEMPLATE.md) وإضافة المعلومات المفقودة. لتسهيل معالجة هذه التذكرة كثيرًا ، يرجى التأكد من التحقق من (https://laravel-excel.maatwebsite.nl/docs/3.0/getting-started/contributing) وتحقق جيدًا مما إذا كنت قد ملأت نموذج المشكلة بشكل صحيح. سيسمح لنا ذلك باستلام تذكرتك بكفاءة أكبر. ستحظى المشكلات التي تتبع الإرشادات بشكل صحيح بالأولوية على المشكلات الأخرى.

نسخة مكررة من # 1834

استخدم طريقة ToCollection لف كل شيء داخل if($row->filter()->isNotEmpty())
""
مجموعة الوظائف العامة (مجموعة الصفوف $)
{
foreach (الصفوف $ كـ $ row) {
إذا ($ row-> filter () -> isNotEmpty ()) {
// يمكنك الذهاب إلى المنطق هنا

            $user = User::create([
                'name' => ucwords($row['name']),
                'class' => $row['class'],
                ...
            ]);
        }
    }   
}

""

كيف يعمل على طريقة toModel؟

يمكنك إرجاع القيمة null في toModel ، وسوف يتم تخطي تلك الصفوف.

أهلا،
لقد حاولت استخدام $ row-> filter () -> isNotEmpty () ولكن نظرًا لحقيقة أنني أستخدم WithValidation ، تتوقف الرموز مع وجود خطأ في التحقق من الصحة. تبدو قواعدي كما يلي:

public function rules(): array { return [ 'name' => 'required', '*.name' => 'required', 'email' => 'required|email', '*.email' => 'required|email', 'discount' => 'nullable|numeric', '*.discount' => 'nullable|numeric', ]; }

لسوء الحظ ، إذا كان لديك ملف excel ، فاحذف محتوى بعض الصفوف في نهاية ملف Excel لا يزال Laravel-Excel يتعرف عليها على أنها ليست فارغة. ثم فشل التحقق من الصحة. أريد تخطي هذه الصفوف قبل التحقق من الصحة.

@ Seven21 ، هل وجدت حلاً لهذا؟ هل حصل أي شخص على حل هذه المشكلة؟

أستخدم الحل الذي يساعد في حالتي. يتم تمديد التحقق من الصحة من خلال nullable في جميع الصفوف لتجنب الأخطاء ثم في الطريقة التي أضفتها
public function model(array $row) {if(!array_filter($row)) { return null;} return new Customer([..... وتخطى هذه الصفوف في هذه المرحلة. لست سعيدًا بهذا لأنني لا أستطيع إرجاع رسالة خطأ مفيدة ولكني لم أجد أي حل أفضل طريقة لتشغيل الكود.

@ Seven21 شكرًا جزيلاً لك على مثالك ورسالتك المفيدة ، لكنني أعتقد أيضًا أن هذه ليست طريقة جيدة إذا استخدمنا عمليات التحقق بالفعل.

mohamednizar كيف حللت هذه المشكلة؟

لم أقم بحل المشكلة تمامًا ، ولكن بالنسبة للحل الخاص بي ، أضفت الوظائف المخصصة التالية لإرجاع حجم الدُفعة وحد الصف. سيتم احتساب حد الصف فقط في حالة وجود بيانات في العمود.

 public function limit(): int {
        $highestColumn = $this->worksheet->getHighestDataColumn(3);
        $higestRow = 0;
        for ($row = $this->startRow(); $row <= $this->highestRow; $row++) {
            $rowData = $this->worksheet->rangeToArray('A' . $row . ':' . $highestColumn . $row, NULL, TRUE, FALSE);
            if (isEmptyRow(reset($rowData))) {
                continue;
            } else {
                $higestRow += 1;
            }
        }
        return $higestRow;
    }

   public function batchSize(): int {
        $highestColumn = $this->worksheet->getHighestDataColumn(3);
        $higestRow = 1;
        for ($row = $this->startRow(); $row <= $this->highestRow; $row++) {
            $rowData = $this->worksheet->rangeToArray('A' . $row . ':' . $highestColumn . $row, NULL, TRUE, FALSE);
            if (isEmptyRow(reset($rowData))) {
                continue;
            } else {
                $higestRow += 1;
            }
        }
        if ($higestRow == 0) {
            exit;
        } else {
            return $higestRow;
        }
    }

قد يساعدك هذا لبعض الوقت في حل نوع من المشاكل.

يمكنك تجاهل الصف الفارغ عن طريق تحديث ملف config / excel.php.

من:

        /*
        |--------------------------------------------------------------------------
        | Ignore Empty
        |--------------------------------------------------------------------------
        |
        | When dealing with imports, you might be interested in ignoring
        | rows that have null values or empty strings. By default rows
        | containing empty strings or empty values are not ignored but can be
        | ignored by enabling the setting ignore_empty to true.
        |
        */
        'ignore_empty' => false,

ل:

        /*
        |--------------------------------------------------------------------------
        | Ignore Empty
        |--------------------------------------------------------------------------
        |
        | When dealing with imports, you might be interested in ignoring
        | rows that have null values or empty strings. By default rows
        | containing empty strings or empty values are not ignored but can be
        | ignored by enabling the setting ignore_empty to true.
        |
        */
        'ignore_empty' => true,

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات