Laravel-excel: Startreihe (2) liegt hinter der obersten Reihe (1)

Erstellt am 12. Nov. 2018  ·  25Kommentare  ·  Quelle: Maatwebsite/Laravel-Excel

Versionen

PHP-Version: 7.2
Laravel-Version: 5.7
Paketversion: 3.1

Beschreibung

Ich erhalte den Fehler: 'Startzeile (2) liegt hinter der höchsten Zeile (1)' von /Users/administrator/Sites/blog/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/RowIterator.php

Die Tabelle hat Kopfzeilen in der ersten Zeile und ist ein einzelnes Blatt. Die zweite Zeile ist leer, aber sollte das nicht in Ordnung sein? Ich bin mir nicht sicher, wie ich dieses Szenario erklären soll. Jede Hilfe ist willkommen. Danke schön.

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

  }

Hilfreichster Kommentar

Ich habe denselben Fehler!

aber nach dem Entfernen von Blatt 2, 3 gelöst !!

Für diese Situation müssen Sie den Blattindex definieren durch

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

Alle 25 Kommentare

Kannst du den kompletten Stacktrace posten? Es ist jetzt schwer zu erkennen, welcher Import es verursacht.

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.
     *

Das tut mir leid. Hilft das?

Danke!

Habe hier das gleiche Problem!

Laut Stacktrace hat Ihre Datei nur 1 Zeile (die Überschriftenzeile), beim Versuch, jede Zeile zu importieren, beschwert sich PhpSpreadsheet, dass es keine 2. Zeile gibt (und keine Zeilen weiter als die 2. Zeile).

@patrickbrouwers In meinem Fall gibt es definitiv Zeilen und Werte jenseits von Zeile 1. Es scheint, dass ich sicherstellen muss, dass ich BEIDE Bedenken WithChunkReading und WithCustomChunkSize implementiert habe, um das Problem zu lösen. Allerdings habe ich auch eine neue Excel-Datei erstellt und die alten Dateiwerte kopiert.

Klingt so, als wäre etwas mit Ihrer Datei nicht in Ordnung, wenn sie nach dem Kopieren der Werte in eine neue Datei funktioniert.
Falls es sich um eine CSV-Datei handelt, verwenden Sie vielleicht nicht das richtige Trennzeichen?

Ja. Gut möglich. Ich werde hierher zurückkehren, wenn es wieder auftaucht, da ich bald ein paar verschiedene Dateien verarbeiten werde. Sie sind alle XLSX-Dateien.

Klar, lass es mich wissen!

@patrickbrouwers ja das stimmt. Ich versuche, in diesem Fall einen Serverfehler zu verhindern, und ich habe Probleme, ihn abzufangen und die Ausführung der Importmodellmethode zu stoppen.

Bin ich mit RegistersEventListeners in App\Imports\PoliciesImport.php auf dem richtigen Weg? Ich habe herausgefunden, wie ich die höchste Zeile bekomme, aber ich kann nicht herausfinden, wie ich diesen Wert übergeben soll oder wohin ich von hier aus gehen soll.

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

        dd($highestRow);
    }

@abbylovesdon Am besten werfen Sie eine Ausnahme in beforeImport und versuchen Sie, sie im Controller abzufangen. Sie können die höchste Zeile durch die Ausnahme übergeben.

@patrickbrouwers Vielen Dank für deine Hilfe! Ich bin neu bei PHP/Laravel/diesem Paket. Wenn also jemand anderes in meinen Schuhen steckt, habe ich Folgendes getan:

In meiner Importklasse: 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',
        ];
    }

}

Jetzt kann ich in meinem Controller verwenden:

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

Habe hier das gleiche Problem! :((

Habe hier das gleiche Problem! :((

Falls Sie das Problem mit den obigen Vorschlägen und Beispielen nicht beheben können, möchte ich Sie bitten, mithilfe der Problemvorlage ein neues Problem dafür zu eröffnen. Danke!

Ich habe denselben Fehler!

aber nach dem Entfernen von Blatt 2, 3 gelöst !!

Für diese Situation müssen Sie den Blattindex definieren durch

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

Derselbe Fall ist mir passiert, aber ich habe festgestellt, dass dies daran liegt, dass mehrere Blätter in einer Excel-Datei vorhanden sind

Ich hatte gerade das gleiche Problem. Nach einiger Frustration erwies sich mein zugrunde liegender Verdacht als wahr. Es wurde durch eine Aufspaltung in der Tabelle verursacht. Nach dem Auftrennen der ersten Reihe funktionierte es.
image

Laut Stacktrace hat Ihre Datei nur 1 Zeile (die Überschriftenzeile), beim Versuch, jede Zeile zu importieren, beschwert sich PhpSpreadsheet, dass es keine 2. Zeile gibt (und keine Zeilen weiter als die 2. Zeile).

Wie man damit umgeht, wenn Excel nur eine Kopfzeile hat. Ich möchte dem Client die richtige Fehlermeldung anzeigen

Hallo, ich weiß, dass dieser Thread bereits geschlossen ist, aber ich habe hier das gleiche Problem und nichts in diesem Thread hilft bei meinem Problem.

Ich lade 10.000 Zeilen gleichzeitig hoch und erhalte diesen Fehler Start row (2) is beyond highest row (1) . Aber wenn ich es in 5k aufteile, funktioniert es wie Magie.

Was scheint hier das Problem zu sein?
Vielen Dank im Voraus!

Hallo, ich weiß, dass dieser Thread bereits geschlossen ist, aber ich habe hier das gleiche Problem und nichts in diesem Thread hilft bei meinem Problem.

Ich lade 10.000 Zeilen gleichzeitig hoch und erhalte diesen Fehler Start row (2) is beyond highest row (1) . Aber wenn ich es in 5k aufteile, funktioniert es wie Magie.

Was scheint hier das Problem zu sein?
Vielen Dank im Voraus!

Vielleicht ein Fehler in der Originaldatei, den Sie durch Aufteilen beheben. Es könnte auch ein Leistungsproblem sein, aber schwer zu sagen, ohne Ihren Code und Ihre Serverspezifikationen zu sehen. Ich tippe auf einen Dateifehler.

Ist mir gerade passiert. Das passiert, wenn die Datei größer als die PHP-Direktive „upload_max_filesize“ ist. Ich habe eine Aufteilung von 500 für eine Dateigröße von 5 MB mit 40.000 Zeilen verwendet, während meine maximale „upload_max_filesize“ auf AWS AMI 2 MB betrug. Darf ich den Autoren vorschlagen, die Prüfung auf die maximale Upload-Größe zu implementieren und diesen Fehler auszugeben, anstatt Start row (2) is beyond highest row (1) zu verwirren. Als ich das Limit „upload_max_filesize“ erhöhte, war der Fehler weg und der Datei-Upload war erfolgreich.

Es gibt höchstwahrscheinlich mehr Gründe, warum phpspreadsheet diesen Fehler auslöst. Sie können dort immer eine PR versuchen.

@GlennM danke für die Antwort!
Ich habe eine Problemumgehung dafür erstellt und sie entspricht bereits den Anforderungen für mein Projekt. Ich werde Ihren Vorschlag berücksichtigen, wenn ich dieses Problem in Zukunft habe.

@patrickbrouwers In meinem Fall gibt es definitiv Zeilen und Werte jenseits von Zeile 1. Es scheint, dass ich sicherstellen muss, dass ich BEIDE Bedenken WithChunkReading und WithCustomChunkSize implementiert habe, um das Problem zu lösen. Allerdings habe ich auch eine neue Excel-Datei erstellt und die alten Dateiwerte kopiert.

bei mir hilft es. habe immer noch das gleiche Problem

Löscharbeitsblätter sind leer

Löscharbeitsblätter sind leer

Dies war mein Fall, wenn Ihre Datei leere Arbeitsblätter enthält und Sie "WithHeadingRow" verwenden, tritt dieses Problem auf.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen