Laravel-excel: صف البداية (2) بعد أعلى صف (1)

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

إصدارات

إصدار PHP: 7.2
إصدار Laravel: 5.7
إصدار الحزمة: 3.1.1

وصف

أتلقى الخطأ: "صف البداية (2) يتجاوز الصف الأعلى (1)" من / المستخدمون / المسؤولون / المواقع/blog/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/RowIterator.php

يحتوي جدول البيانات على رؤوس في الصف الأول وهو عبارة عن ورقة واحدة. الصف الثاني فارغ لكن ألا يجب أن يكون هذا على ما يرام؟ لست متأكدًا من كيفية حساب هذا السيناريو. هو موضع تقدير أي مساعدة. شكرا لك.

App \ Imports \ PoliciesImport.php

<?php

namespace App\Imports;

use App\Policy;
use Maatwebsite\Excel\Concerns\ToModel;
use Maatwebsite\Excel\Concerns\WithValidation;
use Maatwebsite\Excel\Concerns\WithHeadingRow;
use Maatwebsite\Excel\Concerns\Importable;
use Maatwebsite\Excel\Concerns\WithMultipleSheets;
use Auth;


class PoliciesImport implements ToModel, WithValidation, WithHeadingRow, WithMultipleSheets
{

    use Importable;

    /**
    * <strong i="14">@param</strong> array $row
    *
    * <strong i="15">@return</strong> \Illuminate\Database\Eloquent\Model|null
    */
    public function model(array $row)
    {
        return new Policy([
          'user_id'     => Auth::user()->id,
          'policy_name' => $row['name'],
          'phone'       => $row['phone'],
          'street'      => $row['address'],
          'city'        => $row['city'],
          'state'       => $row['state'],
          'postal_code' => $row['postal_code'],
        ]);
    }

    public function sheets(): array
    {
        return [
            // Select by sheet index
            0 => new PoliciesImport(),
        ];
    }

    public function rules(): array
    {
        return [
            'policy_name' => 'required|string',
             '*.policy_name' => 'required|string',
        ];
    }

}

PolicyController.php

public function import(Request $request)
  {
    if ($request->hasFile('file')) {

      // validate incoming request
      $this->validate($request, [
        'file' => 'required|file|mimes:xls,xlsx,csv|max:10240', //max 10Mb
      ]);

          if ($request->file('file')->isValid()) {

              $file = $request->file('file');
              $path = $file->store('uploads/policy');
              $fileHeaders = current((new HeadingRowImport)->toArray($path)[0]);
              $validHeaders = [
                'name','phone','address','state','city','postal_code'
              ];
              sort($fileHeaders);
              sort($validHeaders);

              // Check the File Headers
              if ($fileHeaders == $validHeaders) {
                  // Import the saved excel file
                  (new PoliciesImport)->import($path);
              }

              Storage::delete($path);
          }
      }

      return back();

  }

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

لدي نفس الخطأ!

ولكن بعد إزالة الرقاقة 2 ، 3 تحل !!

في هذه الحالة ، تحتاج إلى تحديد فهرس الورقة بواسطة

    public function sheets(): array
    {
        return [
            // Select by sheet index
            0 => new pricelist_items(),
        ];
    }

ال 25 كومينتر

يمكنك نشر Stacktrace الكامل؟ من الصعب الآن معرفة سبب الاستيراد الذي يسبب ذلك.

screen shot 2018-11-12 at 8 02 38 am 2

/Users/administrator/Sites/blog/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/RowIterator.php

     *
     * <strong i="8">@param</strong> int $startRow The row number at which to start iterating
     *
     * <strong i="9">@throws</strong> PhpSpreadsheetException
     *
     * <strong i="10">@return</strong> RowIterator
     */
    public function resetStart($startRow = 1)
    {
        if ($startRow > $this->subject->getHighestRow()) {
            throw new PhpSpreadsheetException("Start row ({$startRow}) is beyond highest row ({$this->subject->getHighestRow()})");
        }

        $this->startRow = $startRow;
        if ($this->endRow < $this->startRow) {
            $this->endRow = $this->startRow;
        }
        $this->seek($startRow);

        return $this;
    }

    /**
     * (Re)Set the end row.
     *

اسف بشأن ذلك. هل هذا يساعد؟

شكرا!

لها نفس المشكلة هنا!

وفقًا لتتبع المكدس ، يحتوي ملفك على صف واحد فقط (صف العنوان) ، عند محاولة استيراد كل صف ، يشكو PhpSpreadsheet من عدم وجود صف ثانٍ (ولا توجد صفوف أبعد من الصف الثاني)

patrickbrouwers بالنسبة لحالتي ، هناك بالتأكيد صفوف وقيم تتجاوز الصف 1. يبدو أنه يتعين علي التأكد من أنني قمت بتنفيذ كلا من المخاوف WithChunkReading و WithCustomChunkSize لتجاوز المشكلة. بعد قولي هذا ، قمت أيضًا بإنشاء ملف Excel جديد ونسخه عبر قيم الملف القديمة.

يبدو أنه قد يكون هناك خطأ ما في ملفك ، إذا كان يعمل بعد نسخ القيم إلى ملف جديد.
في حال كان ملف CSV ، فربما لا يستخدم المحدد الصحيح؟

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

بالتأكيد ، أعلمني!

patrickbrouwers نعم هذا صحيح. أحاول منع حدوث خطأ بالخادم في هذه الحالة ، وأواجه صعوبة في اكتشافه وإيقاف تنفيذ طريقة نموذج الاستيراد.

هل أنا على المسار الصحيح باستخدام RegistersEventListeners في App \ Imports \ PoliciesImport.php؟ لقد اكتشفت كيفية الحصول على أعلى صف ولكن لا يمكنني معرفة كيفية تمرير هذه القيمة أو إلى أين أذهب من هنا.

    public static function beforeImport(BeforeImport $event)
    {
        $worksheet = $event->reader->getActiveSheet();
        $highestRow = $worksheet->getHighestRow(); // e.g. 10

        dd($highestRow);
    }

abbylovesdon الأفضل هو طرح استثناء قبل الاستيراد ومحاولة التقاطه في وحدة التحكم. يمكنك تمرير أعلى صف من خلال الاستثناء.

patrickbrouwers شكرًا جزيلاً على مساعدتك! أنا جديد على PHP / Laravel / This Package ، لذا إذا كان هناك أي شخص آخر في مكاني ، فإليك ما فعلته:

في فئة الاستيراد الخاصة بي: App \ Imports \ PoliciesImport.php

<?php

namespace App\Imports;

use App\Policy;
use Auth;
use Maatwebsite\Excel\Concerns\ToModel;
use Maatwebsite\Excel\Validators\Failure;
use Maatwebsite\Excel\Validators\ValidationException;
use Maatwebsite\Excel\Concerns\WithValidation;
use Maatwebsite\Excel\Concerns\WithHeadingRow;
use Maatwebsite\Excel\Concerns\Importable;
use Maatwebsite\Excel\Concerns\WithEvents;
use Maatwebsite\Excel\Concerns\RegistersEventListeners;
use Maatwebsite\Excel\Events\BeforeImport;
use Maatwebsite\Excel\Concerns\WithMultipleSheets;

class PoliciesImport implements ToModel, WithValidation, WithHeadingRow, WithMultipleSheets, WithEvents
{
    use Importable, RegistersEventListeners;

    public static function beforeImport(BeforeImport $event)
    {
        $worksheet = $event->reader->getActiveSheet();
        $highestRow = $worksheet->getHighestRow(); // e.g. 10

        if ($highestRow < 2) {
            $error = \Illuminate\Validation\ValidationException::withMessages([]);
            $failure = new Failure(1, 'rows', [0 => 'Now enough rows!']);
            $failures = [0 => $failure];
            throw new ValidationException($error, $failures);
        }
    }

    /**
    * <strong i="8">@param</strong> array $row
    *
    * <strong i="9">@return</strong> \Illuminate\Database\Eloquent\Model|null
    */
    public function model(array $row)
    {
        return new Policy([
          'user_id'     => Auth::user()->id,
          'policy_name' => $row['name'],
          'phone'       => $row['phone'],
          'street'      => $row['address'],
          'city'        => $row['city'],
          'state'       => $row['state'],
          'postal_code' => $row['postal_code'],
        ]);
    }

    public function sheets(): array
    {
        return [
            // Select by sheet index
            0 => new PoliciesImport(),
        ];
    }

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

}

الآن في وحدة التحكم الخاصة بي يمكنني استخدام:

                  try {
                        (new PoliciesImport)->import($path);
                  } catch (\Exception $e) {
                        $failures = $e->failures();
                        dd($failures[0]);
                  }

لها نفس المشكلة هنا! : ((

لها نفس المشكلة هنا! : ((

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

لدي نفس الخطأ!

ولكن بعد إزالة الرقاقة 2 ، 3 تحل !!

في هذه الحالة ، تحتاج إلى تحديد فهرس الورقة بواسطة

    public function sheets(): array
    {
        return [
            // Select by sheet index
            0 => new pricelist_items(),
        ];
    }

حدثت نفس الحالة معي ، لكنني أدركت أن السبب في وجود أوراق متعددة في ملف Excel

لقد مررت بنفس المشكلمة للتو. بعد بعض الإحباط ، ثبتت شكوكي الأساسية. كان ناتجًا عن انقسام في جدول البيانات. بعد "عدم التقسيم" الصف الأول نجح.
image

وفقًا لتتبع المكدس ، يحتوي ملفك على صف واحد فقط (صف العنوان) ، عند محاولة استيراد كل صف ، يشكو PhpSpreadsheet من عدم وجود صف ثانٍ (ولا توجد صفوف أبعد من الصف الثاني)

كيفية التعامل إذا كان Excel يحتوي فقط على صف الرأس. أريد أن أظهر رسالة خطأ مناسبة للعميل

مرحبًا ، أعلم أن هذا الموضوع مغلق تمامًا ولكني أواجه نفس المشكلة هنا ولا شيء في هذا الموضوع يساعد في حل مشكلتي.

أقوم بتحميل 10 آلاف صف في نفس الوقت وتلقيت هذا الخطأ Start row (2) is beyond highest row (1) . لكن عندما قسمتها إلى 5 كيلو ، فإنها تعمل كالسحر.

ما يبدو أن المشكلة هنا؟
شكرا لك مقدما!

مرحبًا ، أعلم أن هذا الموضوع مغلق تمامًا ولكني أواجه نفس المشكلة هنا ولا شيء في هذا الموضوع يساعد في حل مشكلتي.

أقوم بتحميل 10 آلاف صف في نفس الوقت وتلقيت هذا الخطأ Start row (2) is beyond highest row (1) . لكن عندما قسمتها إلى 5 كيلو ، فإنها تعمل كالسحر.

ما يبدو أن المشكلة هنا؟
شكرا لك مقدما!

ربما خطأ في الملف الأصلي قمت بحلّه بتقسيمه. قد تكون مشكلة في الأداء أيضًا ، ولكن من الصعب تحديدها دون رؤية الكود الخاص بك ومواصفات الخادم الخاص بك. أعتقد أنه خطأ ملف.

لقد حدث هذا لي للتو. يحدث عندما يكون الملف أكبر من أمر "upload_max_filesize" الخاص بـ PHP. لقد استخدمت تقسيم 500 لملف بحجم 5 ميجابايت مع 40 ألف صف ، بينما كان الحد الأقصى لـ "upload_max_filesize" على AWS AMI هو 2 ميجابايت. هل لي أن أقترح على المؤلفين تنفيذ التحقق من حجم التحميل الأقصى ، وطباعة هذا الخطأ بدلاً من الخلط بين Start row (2) is beyond highest row (1) . عندما قمت بزيادة حد "upload_max_filesize" ، اختفى الخطأ وتم تحميل الملف بنجاح.

هناك على الأرجح المزيد من الأسباب التي تجعل phpspreadsheet قد يتسبب في هذا الخطأ. يمكنك دائمًا محاولة إقامة علاقات عامة هناك.

GlennM شكرا على الرد!
لقد توصلت إلى حل بديل لها وهي تناسب احتياجات مشروعي في الوقت الحالي. سوف ننظر في اقتراحك إذا واجهت هذه المشكلة في المستقبل.

patrickbrouwers بالنسبة لحالتي ، هناك بالتأكيد صفوف وقيم تتجاوز الصف 1. يبدو أنه يتعين علي التأكد من أنني قمت بتنفيذ كلا من المخاوف WithChunkReading و WithCustomChunkSize لتجاوز المشكلة. بعد قولي هذا ، قمت أيضًا بإنشاء ملف Excel جديد ونسخه عبر قيم الملف القديمة.

يساعدني. لا يزال لدي نفس المشكلة

حذف أوراق العمل فارغة

حذف أوراق العمل فارغة

كانت هذه حالتي ، إذا كان الملف يحتوي على أوراق عمل فارغة وكنت تستخدم "WithHeadingRow" ، فستظهر هذه المشكلة.

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