Laravel-excel: Baris awal (2) berada di luar baris tertinggi (1)

Dibuat pada 12 Nov 2018  ·  25Komentar  ·  Sumber: Maatwebsite/Laravel-Excel

Versi

Versi PHP: 7.2
Versi Laravel: 5.7
Versi paket: 3.1

Keterangan

Saya mendapatkan pesan error: 'Start row (2) is Beyond the high row (1)' from /Users/administrator/Sites/blog/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/RowIterator.php

Spreadsheet memiliki header pada baris pertama dan merupakan satu lembar. Baris kedua kosong tetapi bukankah ini boleh? Saya tidak yakin bagaimana menjelaskan skenario ini. Bantuan apa pun dihargai. Terima kasih.

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

  }

Komentar yang paling membantu

saya memiliki kesalahan yang sama!

tetapi setelah menghapus lembar 2 , 3 terpecahkan !!

untuk situasi ini Anda perlu menentukan indeks lembar dengan

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

Semua 25 komentar

Bisakah Anda memposting stacktrace lengkap? Sulit untuk melihat sekarang impor mana yang menyebabkannya.

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

Maaf tentang itu. Apakah ini membantu?

Terima kasih!

Memiliki masalah yang sama di sini!

Menurut stacktrace file Anda hanya memiliki 1 baris (baris judul), ketika mencoba mengimpor setiap baris, PhpSpreadsheet mengeluh bahwa tidak ada baris ke-2 (dan tidak ada baris lebih jauh dari baris ke-2)

@patrickbrouwers Untuk kasus saya, pasti ada baris dan nilai di luar baris 1. Sepertinya saya harus memastikan saya menerapkan KEDUA kekhawatiran WithChunkReading dan WithCustomChunkSize untuk mengatasi masalah. Karena itu, saya juga membuat file Excel baru dan menyalin nilai file lama.

Kedengarannya mungkin ada yang salah dengan file Anda, jika berhasil setelah menyalin nilainya ke file baru.
Jika ini adalah CSV, mungkin tidak menggunakan pembatas yang tepat?

Ya. Cukup mungkin. Saya akan kembali ke sini jika muncul lagi karena saya akan segera memproses beberapa file yang berbeda. Semuanya adalah file XLSX.

Tentu, beri tahu saya!

@patrickbrouwers ya ini benar. Saya mencoba mencegah kesalahan server dalam kasus ini, dan saya kesulitan bagaimana menangkapnya dan menghentikan metode model impor agar tidak dieksekusi.

Apakah saya berada di jalur yang benar dengan menggunakan RegistersEventListeners di App\Imports\PoliciesImport.php? Saya menemukan cara untuk mendapatkan baris tertinggi tetapi saya tidak tahu bagaimana cara melewatkan nilai ini atau ke mana harus pergi dari sini.

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

        dd($highestRow);
    }

@abbylovesdon yang terbaik adalah melempar pengecualian di beforeImport dan coba tangkap di controller. Anda dapat melewati baris tertinggi melalui pengecualian.

@patrickbrouwers Terima kasih banyak atas bantuan Anda! Saya baru mengenal PHP/Laravel/Paket Ini jadi jika ada orang lain di posisi saya, inilah yang saya lakukan:

Di Kelas Impor saya: 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',
        ];
    }

}

Sekarang di pengontrol saya, saya dapat menggunakan:

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

Memiliki masalah yang sama di sini! :((

Memiliki masalah yang sama di sini! :((

Jika Anda tidak dapat memperbaiki masalah menggunakan saran dan contoh di atas, saya akan meminta Anda untuk membuka masalah baru untuk itu, menggunakan template masalah. Terima kasih!

saya memiliki kesalahan yang sama!

tetapi setelah menghapus lembar 2 , 3 terpecahkan !!

untuk situasi ini Anda perlu menentukan indeks lembar dengan

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

Kasus yang sama terjadi pada saya, tetapi saya menyadari bahwa itu disebabkan oleh beberapa lembar yang ada di file excel

Saya hanya memiliki masalah yang sama. Setelah beberapa frustrasi, kecurigaan mendasar saya terbukti benar. Itu disebabkan oleh perpecahan dalam spreadsheet. Setelah 'membuka pemisahan', baris pertama berhasil.
image

Menurut stacktrace file Anda hanya memiliki 1 baris (baris judul), ketika mencoba mengimpor setiap baris, PhpSpreadsheet mengeluh bahwa tidak ada baris ke-2 (dan tidak ada baris lebih jauh dari baris ke-2)

Bagaimana menangani jika excel hanya memiliki baris header. saya ingin menunjukkan pesan kesalahan yang tepat kepada klien

Halo, saya tahu utas ini sudah ditutup, tetapi saya mengalami masalah yang sama di sini dan tidak ada di utas ini yang membantu masalah saya.

Saya mengunggah 10 ribu baris secara bersamaan dan saya mendapatkan kesalahan ini Start row (2) is beyond highest row (1) . Tetapi ketika saya membaginya menjadi 5k, itu bekerja seperti sulap.

Apa yang tampaknya menjadi masalah di sini?
Terima kasih sebelumnya!

Halo, saya tahu utas ini sudah ditutup, tetapi saya mengalami masalah yang sama di sini dan tidak ada di utas ini yang membantu masalah saya.

Saya mengunggah 10 ribu baris secara bersamaan dan saya mendapatkan kesalahan ini Start row (2) is beyond highest row (1) . Tetapi ketika saya membaginya menjadi 5k, itu bekerja seperti sulap.

Apa yang tampaknya menjadi masalah di sini?
Terima kasih sebelumnya!

Mungkin kesalahan dalam file asli yang Anda atasi dengan memisahkannya. Ini bisa menjadi masalah kinerja juga, tetapi sulit untuk mengetahuinya tanpa melihat kode dan spesifikasi server Anda. Saya kira itu kesalahan file.

Baru saja ini terjadi pada saya. Terjadi ketika file lebih besar dari direktif 'upload_max_filesize' PHP. Saya menggunakan chunking 500 untuk ukuran file 5mb dengan 40k baris, sedangkan 'upload_max_filesize' maksimum saya di AWS AMI adalah 2MB. Bolehkah saya menyarankan kepada penulis untuk menerapkan pemeriksaan ukuran unggahan maksimum, dan mencetak kesalahan ini alih-alih membingungkan Start row (2) is beyond highest row (1) . Ketika saya meningkatkan batas 'upload_max_filesize', kesalahan itu hilang dan unggahan file berhasil.

Kemungkinan besar ada lebih banyak alasan mengapa phpspreadsheet dapat menimbulkan kesalahan itu. Anda selalu dapat mencoba PR di sana.

@GlennM terima kasih atas jawabannya!
Saya telah membuat solusi untuk itu dan itu selalu sesuai dengan kebutuhan proyek saya untuk saat ini. Akan melihat saran Anda jika saya memiliki masalah ini di masa depan.

@patrickbrouwers Untuk kasus saya, pasti ada baris dan nilai di luar baris 1. Sepertinya saya harus memastikan saya menerapkan KEDUA kekhawatiran WithChunkReading dan WithCustomChunkSize untuk mengatasi masalah. Karena itu, saya juga membuat file Excel baru dan menyalin nilai file lama.

itu membantu untuk saya. masih punya masalah yang sama

hapus lembar kerja yang kosong

hapus lembar kerja yang kosong

Ini adalah kasus saya, jika file Anda memiliki lembar kerja kosong dan Anda menggunakan "WithHeadingRow" masalah ini muncul.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat

Masalah terkait

lucatamtam picture lucatamtam  ·  3Komentar

vandolphreyes picture vandolphreyes  ·  3Komentar

matthewslouismarie picture matthewslouismarie  ·  3Komentar

wwendorf picture wwendorf  ·  3Komentar

ellej16 picture ellej16  ·  3Komentar