Laravel-excel: [Frage] Wie man leere Zeilen überspringt (3.1)

Erstellt am 29. Okt. 2018  ·  12Kommentare  ·  Quelle: Maatwebsite/Laravel-Excel

  • Paketversion: 3.1

Beschreibung

Wie überspringe ich leere Zeilen im Dokument?

more information needed

Hilfreichster Kommentar

Hallo,
Ich habe versucht, $row->filter()->isNotEmpty() zu verwenden, aber aufgrund der Tatsache, dass ich WithValidation verwende, stoppt der Code mit einem Validierungsfehler. Meine Regeln sehen so aus:

public function rules(): array { return [ 'name' => 'required', '*.name' => 'required', 'email' => 'required|email', '*.email' => 'required|email', 'discount' => 'nullable|numeric', '*.discount' => 'nullable|numeric', ]; }

Wenn Sie eine Excel-Datei haben und den Inhalt einiger Zeilen am Ende der Excel-Datei löschen, erkennt Laravel-Excel diese leider immer noch als nicht leer. Dann schlägt die Validierung fehl. Ich möchte solche Zeilen vor der Validierung überspringen.

Alle 12 Kommentare

Vielen Dank für das Einreichen des Tickets. Leider sind Ihre Angaben unvollständig. Wir müssen wissen, welche Version Sie verwenden und wie Sie sie reproduzieren können. Bitte fügen Sie Codebeispiele bei. Bevor wir es abholen können, überprüfen Sie bitte (https://github.com/Maatwebsite/Laravel-Excel/blob/3.0/.github/ISSUE_TEMPLATE.md) und fügen Sie die fehlenden Informationen hinzu. Um die Bearbeitung dieses Tickets erheblich zu vereinfachen, überprüfen Sie bitte (https://laravel-excel.maatwebsite.nl/docs/3.0/getting-started/contributing) und überprüfen Sie, ob Sie die Problemvorlage ausgefüllt haben korrekt. Dadurch können wir Ihr Ticket effizienter abholen. Probleme, die den Richtlinien korrekt entsprechen, haben Vorrang vor anderen Problemen.

Duplikat von #1834

Verwenden Sie die ToCollection-Methode, um alles innerhalb if($row->filter()->isNotEmpty()) einzuschließen
```
Sammlung öffentlicher Funktionen (Sammlung $rows)
{
foreach($zeilen als $zeile) {
if($row->filter()->isNotEmpty()){
// Ihre Logik kann hier gehen

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

```

Wie funktioniert der toModel-Weg?

Sie können null in toModel zurückgeben, werden diese Zeilen überspringen.

Hallo,
Ich habe versucht, $row->filter()->isNotEmpty() zu verwenden, aber aufgrund der Tatsache, dass ich WithValidation verwende, stoppt der Code mit einem Validierungsfehler. Meine Regeln sehen so aus:

public function rules(): array { return [ 'name' => 'required', '*.name' => 'required', 'email' => 'required|email', '*.email' => 'required|email', 'discount' => 'nullable|numeric', '*.discount' => 'nullable|numeric', ]; }

Wenn Sie eine Excel-Datei haben und den Inhalt einiger Zeilen am Ende der Excel-Datei löschen, erkennt Laravel-Excel diese leider immer noch als nicht leer. Dann schlägt die Validierung fehl. Ich möchte solche Zeilen vor der Validierung überspringen.

@seven21 , hast du dafür eine Lösung gefunden? hat jemand dieses Problem gelöst?

Ich verwende eine Problemumgehung, die in meinem Fall hilft. Die Validierung wird in allen Zeilen um nullable erweitert, um Fehler zu vermeiden, und dann in der Methode, die ich hinzugefügt habe
public function model(array $row) {if(!array_filter($row)) { return null;} return new Customer([..... und überspringen Sie diese Zeilen an dieser Stelle. Ich bin damit nicht wirklich zufrieden, da ich keine nützliche Fehlermeldung zurückgeben kann, aber da ich keine Lösung gefunden habe, wie ich den Code am besten zum Laufen bringe.

@seven21 Vielen Dank für Ihr Beispiel und Ihre nützliche Nachricht, aber ich denke auch, dass dies kein guter Weg ist, wenn wir tatsächlich Validierungen verwenden.

@mohamednizar , wie hast du dieses Problem gelöst?

Ich habe das Problem nicht vollständig gelöst, aber für meine Lösung habe ich die folgenden benutzerdefinierten Funktionen hinzugefügt, um die Stapelgröße und das Zeilenlimit zurückzugeben. Das Zeilenlimit wird nur gezählt, wenn Daten in der Spalte vorhanden sind.

 public function limit(): int {
        $highestColumn = $this->worksheet->getHighestDataColumn(3);
        $higestRow = 0;
        for ($row = $this->startRow(); $row <= $this->highestRow; $row++) {
            $rowData = $this->worksheet->rangeToArray('A' . $row . ':' . $highestColumn . $row, NULL, TRUE, FALSE);
            if (isEmptyRow(reset($rowData))) {
                continue;
            } else {
                $higestRow += 1;
            }
        }
        return $higestRow;
    }

   public function batchSize(): int {
        $highestColumn = $this->worksheet->getHighestDataColumn(3);
        $higestRow = 1;
        for ($row = $this->startRow(); $row <= $this->highestRow; $row++) {
            $rowData = $this->worksheet->rangeToArray('A' . $row . ':' . $highestColumn . $row, NULL, TRUE, FALSE);
            if (isEmptyRow(reset($rowData))) {
                continue;
            } else {
                $higestRow += 1;
            }
        }
        if ($higestRow == 0) {
            exit;
        } else {
            return $higestRow;
        }
    }

Manchmal kann dies Ihnen helfen, einige Probleme zu lösen.

Sie können die leere Zeile ignorieren, indem Sie die Datei config/excel.php aktualisieren.

von:

        /*
        |--------------------------------------------------------------------------
        | Ignore Empty
        |--------------------------------------------------------------------------
        |
        | When dealing with imports, you might be interested in ignoring
        | rows that have null values or empty strings. By default rows
        | containing empty strings or empty values are not ignored but can be
        | ignored by enabling the setting ignore_empty to true.
        |
        */
        'ignore_empty' => false,

zu:

        /*
        |--------------------------------------------------------------------------
        | Ignore Empty
        |--------------------------------------------------------------------------
        |
        | When dealing with imports, you might be interested in ignoring
        | rows that have null values or empty strings. By default rows
        | containing empty strings or empty values are not ignored but can be
        | ignored by enabling the setting ignore_empty to true.
        |
        */
        'ignore_empty' => true,

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen