Laravel-excel: Das Datumsfeld [BUG] wird nicht importiert

Erstellt am 10. März 2020  ·  14Kommentare  ·  Quelle: Maatwebsite/Laravel-Excel

Voraussetzungen

  • [Х] Überprüft, ob Ihre Laravel Excel-Version weiterhin unterstützt wird: https://docs.laravel-excel.com/3.1/getting-started/support.html#supported -versions
  • [Х] Das Problem kann außerhalb von Code reproduziert werden und ist auf Laravel Excel beschränkt.
  • [Х] Überprüft, ob Ihr Problem noch nicht eingereicht wurde.
  • [Х] Überprüft, ob keine PR eingereicht wurde, die dieses Problem behebt.
  • [Х] Die gesamte Ausgabevorlage wurde ausgefüllt

Versionen

  • PHP-Version: 7.2.19
  • Laravel-Version: 6.17.1
  • Paketversion: 3.1

Beschreibung

created_at Feld

Schritte zum Reproduzieren

namespace App\Imports;

use App\NewsPost;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Collection;
use Maatwebsite\Excel\Concerns\ToCollection;
use Maatwebsite\Excel\Concerns\WithHeadingRow;

class NewsImport implements ToCollection, WithHeadingRow

{
    public $rowCount = null;

    public function collection(Collection $rows)
    {
        News::truncate();

        foreach ($rows as $row) 
        { 
          if( !empty($row['category_id'])) {  

            NewsPost::create([

               'category_id'=> $row['category_id'],
               'title'      => $row['title'], 
               'sef'        => $row['sef'], 
               'introtext'  => $row['introtext'], 
               'fulltext'   => $row['fulltext'], 
               'image'      => $row['image'], 
               'metatitle'  => $row['metatitle'], 
               'metakey'    => $row['metakey'], 
               'metadesc'   => $row['metadesc'], 
               'hits'       => $row['hits'], 
               'created_at' => $row['created_at'], 

            ]);
          }

        }

      $this->rowCount = $rows->count();

    }

}
namespace App\Admin\Controllers;

use Illuminate\Support\Facades\DB;
use App\Imports\NewsPostImport;
use Maatwebsite\Excel\Facades\Excel;

class SeedController extends BaseAdminController
{

    public function index(Content $content)
    {
        DB::statement('SET FOREIGN_KEY_CHECKS = 0');
        Excel::import($newsPost     = new NewsPostImport,       'import/news_posts.xlsm');
        DB::statement('SET FOREIGN_KEY_CHECKS = 1');

        return $content
            ->title('Import & Export')
            ->description('Laravel excel')
            ->withSuccess('Импорт завершен успешно', 
               '<p>Импортировано '. $newsPost->rowCount.' новостей</p>');
    }

}
bug

Hilfreichster Kommentar

So erhalten Sie Carbon, wenn die Datumsspalte als Datum formatiert ist: Carbon::instance(\PhpOffice\PhpSpreadsheet\Shared\Date:: excelToDateTimeObject($row['created_at']))

Alle 14 Kommentare

Ist created_at auf Ihrem Modell ausfüllbar?

Ja. Ich habe alle Felder ausfüllbar

Versuchen Sie, dd () und sehen Sie, was dort drin ist.

Entschuldigung für die Verspätung. Ich war in Urlaub.
Ich habe dd hier gesetzt

            if (empty($row['slug'])) {
              News::create([
                 'category_id'  => $row['category_id'],
                 'title'        => $row['title'],
                 'slug'         => Str::slug($row['title'], '-'),
                 'fulltext'     => $row['fulltext'],
                 'image'        => $row['image'],
                 'metatitle'    => $row['metatitle'],
                 'metakey'      => $row['metakey'],
                 'metadesc'     => $row['metadesc'],
                 'hits'         => $row['hits'],
                 'published_at' => $row['published_at'],
                 'created_at'   => $row['created_at'],
                 'updated_at'   => $row['updated_at'],
                 'deleted_at'   => $row['deleted_at'],
              ]);
              dd($row);
            }

und ich sehe seltsame Datumsausgabe auf der Seite

Illuminate\Support\Collection {#1986 ▼
  #items: array:14 [▼
    "category_id" => 4
    .......
    "published_at" => null
    "created_at" => 41767
  ]
}

In meinem Excel habe ich so ein Date
date

irgendeine Idee?

Ich habe ein Problem gefunden.
Ich setze dd($row) vor News::create und überprüfe, was von Excel kommt.
Und ich sah 41767 wieder.
Dann gehe ich zu Excel und überprüfe die Formatierung des Feldes created_at . Es war Datum. Aber wenn ich das Format sofort von Datum zu Text ändere, sehe ich 41767.
Dabei habe ich verstanden, dass vor dem Import alle Daten in Excel in Text konvertiert werden.
Also habe ich diese Felder manuell in Text konvertiert, Datumsangaben eingegeben und es funktioniert jetzt.

Nur einmal konnte ich erfolgreich importieren und dann habe ich immer noch einige Probleme, die ich nicht verstehen kann.
Das Importieren von Daten bereitet Kopfschmerzen. Ich kann keine Regel sehen, die immer funktioniert.

Ich habe einige Male getestet, wie ich das Datum vor dem Import in Excel halten soll, und sehe kein stabiles Verhalten.

Ich mache alle Datumsfelder Format = Text in Excel.
Wenn ich das Datum 08-05-2014 und als Text formatiere.
Jedenfalls habe ich beim Import einen Fehler

Unexpected data found.
 Unexpected data found.
 Data missing
http://localhost.test/admin/seed

Zeigen auf \ vendor \ nesbot \ carbon \ src \ Carbon \ Traits \ Creator. PHP: 623

        if (static::isStrictModeEnabled()) {
            throw new InvalidArgumentException(implode(PHP_EOL, $lastErrors['errors']));
        }

Aber wenn ich dd($row) mache, sehe ich

 "created_at" => "08-05-2014"

Was ist falsch?

Scheint, als hätte ich eine Lösung gefunden.
Die einzige Möglichkeit besteht darin, das Datum 2014-05-08 in Excel beizubehalten und als Text zu formatieren.
Weil es in dieser Reihenfolge in MySQL = JJJJ-MM-TT gespeichert ist
All dies funktioniert nicht
08-05-2014 - falsche Reihenfolge
08.05.2014 - falsches Trennzeichen und falsche Reihenfolge
2014.05.08 - falsches Trennzeichen

Wenn Datumsfelder in meinem Fall als Datum in Excel formatiert wurden, wurde das Datum 2014-05-08 vor dem Import immer in 41767 konvertiert. Ich weiß nicht warum.
Ich habe versucht, Datum zu Zeitstempel Konverter und es gibt mir
08.05.2014 = 1399507200.
08-05-2014 = 1407182400

Der einzige Weg, wie ich 41767 bekommen konnte, war, als ich es in der Excel-Formel =text(08.05.2014;0) versuchte
Ich nehme an, es wird von Excel konvertiert.
Und es wird konvertiert, auch wenn ich das Datumsfeld auf das Format JJJJ-MM-TT anpasse.

Die einzige funktionierende Lösung ist das Textformat mit JJJJ-MM-TT-Text.
Korrigieren Sie mich, wenn diese Lösung nicht ganz richtig ist.

Ich habe das gleiche Problem. Die 'Datums'-Felder geben eine Zahl zurück (eine Referenz, denke ich?) Und nicht den Wert.

So erhalten Sie Carbon, wenn die Datumsspalte als Datum formatiert ist: Carbon::instance(\PhpOffice\PhpSpreadsheet\Shared\Date:: excelToDateTimeObject($row['created_at']))

Es funktioniert für nicht leere Felder. Wenn das Importskript jedoch ein leeres Feld erreicht, wird es mit dem folgenden Fehler beendet.
Dieses Problem tritt nur in Laravel 7 auf. Mit Laravel 6 habe ich dieses Problem nicht.

SQLSTATE[22007]: Invalid datetime format: 1292 Incorrect datetime value: '1970-01-01 00:00:00' for column 'published_at' at row 1 (SQL: insert into `news_posts` (`category_id`, `title`, `slug`, `fulltext`, `image`, `metatitle`, `metakey`, `metadesc`, `hits`, `is_published`, `published_at`, `created_at`, `updated_at`, `deleted_at`) values ...

Was zu tun ist?
IF-Klausel ist beim Import nicht möglich

                if (empty($row['published_at'])) { 
                    'published_at' => $row['published_at'],
                } else {
                 'published_at' => Carbon::instance(\PhpOffice\PhpSpreadsheet\Shared\Date::excelToDateTimeObject($row['published_at'])),
                }

Es gibt Fehler syntax error, unexpected 'if' (T_IF), expecting ']'

Fügen Sie es in eine temporäre Variable ein

Was meinst du mit "temporäre Variable"?

Ich habe eine akzeptable Lösung gefunden

        foreach ($rows as $row) 
        {  
          if (!empty($row['category_id'])) {
            $slug = empty($row['slug']) ? Str::slug($row['title'], '-') : $row['slug'];
            $published_at = empty($row['published_at']) ? $row['published_at'] : Carbon::instance(\PhpOffice\PhpSpreadsheet\Shared\Date::excelToDateTimeObject($row['published_at']));
            $created_at = empty($row['created_at']) ? $row['created_at'] : Carbon::instance(\PhpOffice\PhpSpreadsheet\Shared\Date::excelToDateTimeObject($row['created_at']));
            $updated_at = empty($row['updated_at']) ? $row['updated_at'] : Carbon::instance(\PhpOffice\PhpSpreadsheet\Shared\Date::excelToDateTimeObject($row['updated_at']));
            $deleted_at = empty($row['deleted_at']) ? $row['deleted_at'] : Carbon::instance(\PhpOffice\PhpSpreadsheet\Shared\Date::excelToDateTimeObject($row['deleted_at']));

              NewsPost::create([
                 'category_id'  => $row['category_id'],
                 'title'        => $row['title'],
                 'slug'         => $slug,
                 'fulltext'     => $row['fulltext'],
                 'image'        => $row['image'],
                 'metatitle'    => $row['metatitle'],
                 'metakey'      => $row['metakey'],
                 'metadesc'     => $row['metadesc'],
                 'hits'         => $row['hits'],
                 'is_published' => $row['is_published'],
                 'published_at' => $published_at,
                 'created_at'   => $created_at,
                 'updated_at'   => $updated_at,
                 'deleted_at'   => $deleted_at,
              ]);             

          }

        }
War diese Seite hilfreich?
0 / 5 - 0 Bewertungen