Laravel-excel: La rangée de départ (2) est au-delà de la rangée la plus élevée (1)

Créé le 12 nov. 2018  ·  25Commentaires  ·  Source: Maatwebsite/Laravel-Excel

Versions

Version PHP : 7.2
Version Laravel : 5.7
Version du paquet : 3.1

La description

J'obtiens l'erreur : 'La ligne de départ (2) est au-delà de la ligne la plus élevée (1)' de /Users/administrator/Sites/blog/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/RowIterator.php

La feuille de calcul a des en-têtes sur la première ligne et est une feuille unique. La deuxième ligne est vide, mais cela ne devrait-il pas convenir ? Je ne sais pas comment expliquer ce scénario. Toute aide est appréciée. Merci.

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

  }

Commentaire le plus utile

j'ai la même erreur !

mais après avoir supprimé la feuille 2, 3 résolu !!

pour cette situation, vous devez définir l'index de la feuille par

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

Tous les 25 commentaires

Pouvez-vous poster le stacktrace complet? Il est difficile de voir maintenant quelle importation en est la cause.

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

Désolé pour ça. est-ce que cela aide?

Merci!

Même problème ici !

Selon le stacktrace, votre fichier n'a qu'une ligne (la ligne d'en-tête), lorsque vous essayez d'importer chaque ligne, PhpSpreadsheet se plaint qu'il n'y a pas de 2ème ligne (et pas de lignes plus loin que la 2ème ligne)

@patrickbrouwers Pour mon cas, il y a définitivement des lignes et des valeurs au-delà de la ligne 1. Il semble que je dois m'assurer que j'ai implémenté les DEUX préoccupations WithChunkReading et WithCustomChunkSize pour résoudre le problème. Cela dit, j'ai également créé un nouveau fichier Excel et copié les anciennes valeurs du fichier.

Il semble qu'il y ait eu un problème avec votre fichier, si cela fonctionne après avoir copié les valeurs dans un nouveau fichier.
Dans le cas où il s'agit d'un CSV, peut-être n'utilisez-vous pas le bon délimiteur ?

Ouais. Tout à fait possible. Je reviendrai ici s'il réapparaît car je traiterai bientôt quelques fichiers différents. Ce sont tous des fichiers XLSX.

Bien sûr, faites-le moi savoir !

@patrickbrouwers oui c'est vrai. J'essaie d'empêcher une erreur de serveur dans ce cas, et j'ai du mal à l'attraper et à empêcher l'exécution de la méthode du modèle d'importation.

Suis-je sur la bonne voie en utilisant RegistersEventListeners dans App\Imports\PoliciesImport.php ? J'ai compris comment obtenir la ligne la plus élevée, mais je n'arrive pas à comprendre comment transmettre cette valeur ni où aller à partir d'ici.

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

        dd($highestRow);
    }

@abbylovesdon le mieux est de lancer une exception dans beforeImport et d'essayer de l'attraper dans le contrôleur. Vous pouvez passer la ligne la plus élevée à travers l'exception.

@patrickbrouwers Merci beaucoup pour votre aide ! Je suis nouveau sur PHP/Laravel/This Package donc si quelqu'un d'autre est à ma place, voici ce que j'ai fait :

Dans ma classe d'importation : 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',
        ];
    }

}

Maintenant, dans mon contrôleur, je peux utiliser :

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

Même problème ici ! :((

Même problème ici ! :((

Si vous ne parvenez pas à résoudre le problème à l'aide des suggestions et des exemples ci-dessus, je vous demanderais d'ouvrir un nouveau problème à l'aide du modèle de problème. Merci!

j'ai la même erreur !

mais après avoir supprimé la feuille 2, 3 résolu !!

pour cette situation, vous devez définir l'index de la feuille par

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

Le même cas m'est arrivé, mais j'ai réalisé que c'était parce que plusieurs feuilles existaient dans un fichier Excel

Je viens d'avoir le même problème. Après une certaine frustration, mes soupçons sous-jacents se sont avérés vrais. Cela était dû à une scission dans la feuille de calcul. Après avoir "découpé" la première ligne, cela a fonctionné.
image

Selon le stacktrace, votre fichier n'a qu'une ligne (la ligne d'en-tête), lorsque vous essayez d'importer chaque ligne, PhpSpreadsheet se plaint qu'il n'y a pas de 2ème ligne (et pas de lignes plus loin que la 2ème ligne)

Comment gérer si Excel n'a qu'une ligne d'en-tête. je veux montrer le bon message d'erreur au client

Bonjour, je sais que ce fil est fermé mais j'ai le même problème ici et rien dans ce fil ne m'aide à résoudre mon problème.

Je télécharge 10 000 lignes en même temps et j'ai cette erreur Start row (2) is beyond highest row (1) . Mais quand je le divise en 5k, cela fonctionne comme par magie.

Quel semble être le problème ici?
Merci d'avance!

Bonjour, je sais que ce fil est fermé mais j'ai le même problème ici et rien dans ce fil ne m'aide à résoudre mon problème.

Je télécharge 10 000 lignes en même temps et j'ai cette erreur Start row (2) is beyond highest row (1) . Mais quand je le divise en 5k, cela fonctionne comme par magie.

Quel semble être le problème ici?
Merci d'avance!

Peut-être une erreur dans le fichier d'origine que vous résolvez en le divisant. Cela pourrait également être un problème de performances, mais difficile à dire sans voir votre code et les spécifications de votre serveur. Je suppose que c'est une erreur de fichier.

Cela vient de m'arriver. Se produit lorsque le fichier est plus grand que la directive 'upload_max_filesize' de PHP. J'ai utilisé une segmentation de 500 pour une taille de fichier de 5 Mo avec 40 000 lignes, tandis que mon 'upload_max_filesize' maximum sur AWS AMI était de 2 Mo. Puis-je suggérer aux auteurs d'implémenter la vérification de la taille de téléchargement maximale et d'imprimer cette erreur au lieu de confondre Start row (2) is beyond highest row (1) . Lorsque j'ai augmenté la limite 'upload_max_filesize', l'erreur a disparu et le téléchargement du fichier a réussi.

Il y a probablement plus de raisons pour lesquelles phpspreadsheet peut générer cette erreur. Vous pouvez toujours tenter un PR là-bas.

@GlennM merci pour la réponse !
J'ai fait une solution de contournement pour cela et cela répond déjà aux besoins de mon projet pour l'instant. J'examinerai votre suggestion si j'avais ce problème à l'avenir.

@patrickbrouwers Pour mon cas, il y a définitivement des lignes et des valeurs au-delà de la ligne 1. Il semble que je dois m'assurer que j'ai implémenté les DEUX préoccupations WithChunkReading et WithCustomChunkSize pour résoudre le problème. Cela dit, j'ai également créé un nouveau fichier Excel et copié les anciennes valeurs du fichier.

ça m'aide. toujours le même problème

supprimer les feuilles de calcul sont vides

supprimer les feuilles de calcul sont vides

C'était mon cas, si votre fichier contient des feuilles de calcul vides et que vous utilisez "WithHeadingRow", ce problème apparaît.

Cette page vous a été utile?
0 / 5 - 0 notes

Questions connexes

contifico picture contifico  ·  3Commentaires

wwendorf picture wwendorf  ·  3Commentaires

ellej16 picture ellej16  ·  3Commentaires

amine8ghandi8amine picture amine8ghandi8amine  ·  3Commentaires

rossjcooper picture rossjcooper  ·  3Commentaires