Laravel-excel: A linha inicial (2) está além da linha mais alta (1)

Criado em 12 nov. 2018  ·  25Comentários  ·  Fonte: Maatwebsite/Laravel-Excel

Versões

Versão do PHP: 7.2
Versão Laravel: 5.7
Versão do pacote: 3.1

Descrição

Estou recebendo o erro: 'A linha inicial (2) está além da linha mais alta (1)' de /Users/administrator/Sites/blog/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/RowIterator.php

A planilha tem cabeçalhos na primeira linha e é uma única folha. A segunda linha está em branco, mas isso não deveria estar bem? Não tenho certeza de como explicar esse cenário. Qualquer ajuda é apreciada. Obrigada.

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

  }

Comentários muito úteis

eu tenho o mesmo erro!

mas depois de retirar a folha 2 , 3 resolvidos !!

para esta situação você precisa definir o índice da folha por

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

Todos 25 comentários

Você pode postar o stacktrace completo? É difícil ver agora qual importação causa isso.

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

/Users/administrador/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.
     *

Desculpe por isso. Isso ajuda?

Obrigado!

Estou tendo o mesmo problema aqui!

De acordo com o stacktrace seu arquivo tem apenas 1 linha (a linha de cabeçalho), ao tentar importar cada linha, PhpSpreadsheet reclama que não há 2ª linha (e nenhuma linha além da 2ª linha)

@patrickbrouwers Para o meu caso, definitivamente existem linhas e valores além da linha 1. Parece que tenho que garantir que implementei AMBAS as preocupações WithChunkReading e WithCustomChunkSize para passar o problema. Dito isso, também criei um novo arquivo do Excel e copiei os valores do arquivo antigo.

Parece que pode ter havido algo errado com seu arquivo, se funcionar depois de copiar os valores para um novo arquivo.
Caso seja um CSV, talvez não esteja usando o delimitador correto?

Sim. Bem possível. Voltarei aqui se aparecer novamente, pois estarei processando alguns arquivos diferentes em breve. Eles são todos arquivos XLSX.

Claro, me avise!

@patrickbrouwers sim, isso é verdade. Estou tentando evitar um erro de servidor neste caso e estou lutando para pegá-lo e interromper a execução do método de modelo de importação.

Estou no caminho certo usando RegistersEventListeners em App\Imports\PoliciesImport.php? Eu descobri como obter a linha mais alta, mas não consigo descobrir como passar esse valor ou para onde ir a partir daqui.

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

        dd($highestRow);
    }

@abbylovesdon melhor é lançar uma exceção em beforeImport e tentar capturá-la no controlador. Você pode passar a linha mais alta pela exceção.

@patrickbrouwers Muito obrigado pela ajuda! Eu sou novo no PHP/Laravel/This Package, então se alguém estiver no meu lugar, aqui está o que eu fiz:

Na minha classe de importação: 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',
        ];
    }

}

Agora no meu controller eu posso usar:

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

Estou tendo o mesmo problema aqui! :((

Estou tendo o mesmo problema aqui! :((

Caso você não consiga corrigir o problema usando as sugestões e exemplos acima, solicito que você abra um novo problema para ele, usando o modelo de problema. Obrigado!

eu tenho o mesmo erro!

mas depois de retirar a folha 2 , 3 resolvidos !!

para esta situação você precisa definir o índice da folha por

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

O mesmo caso aconteceu comigo, mas percebi que é porque várias planilhas existiam em um arquivo do Excel

Acabei de ter o mesmo problema. Depois de alguma frustração, minha suspeita subjacente provou ser verdadeira. Estava sendo causado por uma divisão na planilha. Depois de 'unspliting' a primeira linha funcionou.
image

De acordo com o stacktrace seu arquivo tem apenas 1 linha (a linha de cabeçalho), ao tentar importar cada linha, PhpSpreadsheet reclama que não há 2ª linha (e nenhuma linha além da 2ª linha)

Como lidar se o Excel tiver apenas uma linha de cabeçalho. eu quero mostrar a mensagem de erro adequada ao cliente

Olá, eu sei que este tópico está fechado alrdy, mas estou tendo o mesmo problema aqui e nada neste tópico ajuda com o meu problema.

Estou fazendo upload de 10 mil linhas ao mesmo tempo e recebi este erro Start row (2) is beyond highest row (1) . Mas quando eu divido em 5k, funciona como mágica.

O que parece ser o problema aqui?
Desde já, obrigado!

Olá, eu sei que este tópico está fechado alrdy, mas estou tendo o mesmo problema aqui e nada neste tópico ajuda com o meu problema.

Estou fazendo upload de 10 mil linhas ao mesmo tempo e recebi este erro Start row (2) is beyond highest row (1) . Mas quando eu divido em 5k, funciona como mágica.

O que parece ser o problema aqui?
Desde já, obrigado!

Talvez um erro no arquivo original que você resolva dividindo-o. Também pode ser um problema de desempenho, mas é difícil dizer sem ver seu código e as especificações do servidor. Eu acho que é um erro de arquivo.

Acabou de acontecer isso comigo. Acontece quando o arquivo é maior que a diretiva 'upload_max_filesize' do PHP. Usei o agrupamento de 500 para um tamanho de arquivo de 5 MB com 40 mil linhas, enquanto meu 'upload_max_filesize' máximo na AWS AMI era de 2 MB. Posso sugerir aos autores que implementem a verificação do tamanho máximo de upload e imprimam esse erro em vez de confundir Start row (2) is beyond highest row (1) . Quando aumentei o limite de 'upload_max_filesize', o erro desapareceu e o upload do arquivo foi bem-sucedido.

Provavelmente há mais razões pelas quais o phpspreadsheet pode lançar esse erro. Você sempre pode tentar um PR por lá.

@GlennM obrigado pela resposta!
Eu fiz uma solução para isso e já atende às necessidades do meu projeto por enquanto. Analisarei sua sugestão se eu tiver esse problema no futuro.

@patrickbrouwers Para o meu caso, definitivamente existem linhas e valores além da linha 1. Parece que tenho que garantir que implementei AMBAS as preocupações WithChunkReading e WithCustomChunkSize para passar o problema. Dito isso, também criei um novo arquivo do Excel e copiei os valores do arquivo antigo.

isso ajuda para mim. ainda tem o mesmo problema

as planilhas de exclusão estão vazias

as planilhas de exclusão estão vazias

Este foi o meu caso, se o seu arquivo tiver planilhas vazias e você usar "WithHeadingRow" esse problema aparece.

Esta página foi útil?
0 / 5 - 0 avaliações