Laravel-excel: [PERTANYAAN] abaikanEmpty @ Laravel Excel 3.1

Dibuat pada 14 Okt 2018  ·  14Komentar  ·  Sumber: Maatwebsite/Laravel-Excel

Prasyarat

  • [X] Mampu mereproduksi perilaku di luar kode Anda, masalahnya diisolasi ke Laravel Excel.
  • [X] Memeriksa bahwa masalah Anda belum diajukan.
  • [X] Diperiksa jika tidak ada PR yang dikirimkan yang memperbaiki masalah ini.

Versi

  • Versi PHP: 7.1.18
  • Versi Laravel: 5.7.9
  • Versi paket: 3.1.2

Keterangan

Saya ingin melewatkan baris kosong. Saya memiliki file excel dengan 4 baris tidak kosong. Saat mengimpor itu membuat koleksi dengan 34 item.

Meskipun menurut saya itu tidak relevan, saya menggunakan pengaturan berikut:
Impor dengan perhatian WithMultipleSheets. Lembar individu yang berisi baris kosong menggunakan masalah berikut: ToCollection, WithHeadingRow, WithStartRow.

Versi sebelumnya di Laravel Excel memiliki opsi abaikanEmpty untuk memfilter baris kosong.

Langkah-langkah untuk Reproduksi

Impor file excel yang berisi baris kosong.

Perilaku yang diharapkan:
Saya ingin mendapatkan koleksi hanya dengan baris yang tidak kosong.

Perilaku sebenarnya:
Koleksi dengan baris tidak kosong dan baris kosong.

enhancement

Komentar yang paling membantu

Versi 3.2 akan memiliki masalah SkipsEmptyRows .

Semua 14 komentar

saya juga butuh ini. Melihat masalah, saya menemukan bahwa kami tidak dapat melakukan ini dengan Laravel Excel. Kita harus menggunakan PhpSpreadsheet untuk ini. Saya tidak tahu apakah itu benar, apakah ada cara dengan Laravel Excel.

Bagaimana cara menggunakan "ignoreEmpty" di "Beberapa Lembar"? Jika tidak, melebihi ukuran memori yang diizinkan

Bagaimana cara menggunakan "ignoreEmpty" di "Beberapa Lembar"? Jika tidak, melebihi ukuran memori yang diizinkan

abaikanKosong itu tidak berfungsi lagi T_T

ignoreEmpty dimaksudkan pada sel di 2.1, bukan pada baris. Saat ini tidak ada fungsi abaikanEmptyRows di PhpSpreadsheet. Yang terbaik yang dapat Anda lakukan, lakukan ini, periksa diri Anda di dalam metode ToCollection (mis., periksa dengan (array_filter($row) )

gunakan metode ToCollection untuk membungkus semuanya dalam if($row->filter()->isNotEmpty())
```
koleksi fungsi publik (Koleksi $baris)
{
foreach($baris sebagai $baris) {
if($row->filter()->isNotEmpty()){
// logikamu bisa ke sini

            $user = User::create([
                'name' => ucwords($row['name']),
                'class' => $row['class'],
                ...
            ]);
        }
    }   
}

```

gunakan metode ToCollection untuk membungkus semuanya dalam if($row->filter()->isNotEmpty())

public function collection(Collection $rows)
   {
      foreach($rows as $row) {
          if($row->filter()->isNotEmpty()){
              // you logic can go here

              $user = User::create([
                  'name' => ucwords($row['name']),
                  'class' => $row['class'],
                  ...
              ]);
          }
      }   
   }

sama akan bekerja di "ToModel" ??

Versi 3.2 akan memiliki masalah SkipsEmptyRows .

@patrickbrouwers kapan versi 3.2 akan dirilis?

Ini adalah cara lain untuk menghindari baris kosong

        /** <strong i="7">@var</strong> CellCollection $row */
        foreach ($data as $row) {
            if (!$row->filter()->isEmpty()) {
                // do something 
            }
        }

Adakah yang menemukan solusi untuk masalah ini dengan ToModel saat masih menggunakan masalah WithValidation ?

Versi 3.2 akan memiliki masalah SkipsEmptyRows .

kapan mau rilis?

Saat ini tidak ada waktu untuk mengerjakan 3.2. Jika seseorang ingin mem-backport masalah ke 3.1, saya baik-baik saja dengan memilikinya di 3.1

Saat ini tidak ada waktu untuk mengerjakan 3.2. Jika seseorang ingin mem-backport masalah ke 3.1, saya baik-baik saja dengan memilikinya di 3.1

@patrickbrouwers Saya membuat PR backport, lihat #2984

Versi 3.2 akan memiliki masalah SkipsEmptyRows .

Sebelum rilis 3.2, dan lebih memilih untuk tetap di ToModel , inilah metode solusi saya

1. Lepas landas WithValidation , tetap menjadi fungsi rules() : array

  • Ini untuk menghindari validasi otomatis, kami ingin menjalankan validasi secara manual

    2. Buat Hitungan Baris untuk melacak nomor baris saat ini

  • Jika Anda memiliki Baris Judul, inisialisasi $rows = 1 Anda, jika tidak $rows = 0

  • Tanpa WithValidation , kita juga kehilangan jumlah baris, jadi kita akan membuatnya secara manual

    3. Lewati baris kosong ( Laravel Excel Doc )

  • Dalam kasus saya, saya memeriksa semua bidang yang diperlukan apakah semuanya sudah siap. Jika tidak, berarti ini adalah baris kosong (Contoh pada Langkah 4)

    4. Buat Validator ( Laravel Doc )

use Illuminate\Support\Facades\Validator;
use Illuminate\Validation\ValidationException;

//
public function model(array $rows)
{
   ++$this->rows;

  //#3 Skip the empty rows
  if ( !isset($row['title']) && !isset($row['body'])))
  {
      return null;
  }

 //#4 Create Validators
   $validator = Validator::make($request->all(), [
            'title' => 'required|unique:posts|max:255',
            'body' => 'required',
        ]);

  if ($validation->fails()) {

        //Specify which row got into error
        $errors = $validation->errors()->all();
        foreach ($errors as $key => $err) {
            $errors[$key] = "Error at row #".$this->getRowCount().". ".$err;
        }
        throw ValidationException::withMessages($errors);
    }
}

Semoga ini membantu!

Apakah halaman ini membantu?
0 / 5 - 0 peringkat