Laravel-excel: [BUG] masalah format tanggal impor

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

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

Versi

  • Versi PHP: 7.1
  • Versi Laravel: 5.7
  • Versi paket: 3.1

Keterangan

Saya membuat impor baru dengan WithChunkReading dan ukuran batch. Masalah yang saya hadapi adalah importir mengonversi kolom tanggal menjadi stempel waktu (saya percaya stempel waktunya) 43257.0. setelah menginvestasikan masalah saya menemukan utas yang sangat lama https://github.com/Maatwebsite/Laravel-Excel/issues/404 dan salah satu solusi yang memperbaikinya bagi saya adalah menetapkan nilai true menjadi false di kelas ReadChunk tersedia di vendor/maatwebsite/excel/src/Jobs/ReadChunk.php . garis adalah $this->reader->setReadDataOnly(true);
Solusi ini berfungsi untuk saat ini tetapi ketika kami akan melakukan pembaruan komposer, itu akan hilang karena tidak dapat dikonfigurasi di perpustakaan.

Langkah-langkah untuk Reproduksi

  1. buat excel
  2. tambahkan kolom dengan format tanggal apa pun.
  3. impor excel menggunakan importir metode chunk melalui perpustakaan.

Perilaku yang diharapkan:

Saya berharap perpustakaan mengunggah tanggal seperti yang diharapkan.

Perilaku sebenarnya:

perpustakaan mengonversi tanggal menjadi stempel waktu (dengan asumsi stempel waktunya)

informasi tambahan

Ini kelas impor saya,

` aplikasi namespace\Impor;

gunakan Aplikasi\Sampel;
gunakan Maatwebsite\Excel\Concerns\ToModel;
gunakan Maatwebsite\Excel\Concerns\WithBatchInserts;
gunakan Maatwebsite\Excel\Concerns\WithChunkReading;
gunakan Maatwebsite\Excel\Concerns\WithHeadingRow;
gunakan Maatwebsite\Excel\Imports\HeadingRowFormatter;

HeadingRowFormatter::default('none');

kelas Contoh mengimplementasikan ToModel, WithHeadingRow, WithBatchInserts, WithChunkReading
{

public function model(array $row)
{


    return new user([
        'UserName'           => $row['UserName'],
        'Password'           => $row['Password'],
        'date'               => $row['date'],
    ]);
}

public function batchSize(): int
{
    return 1000;
}

public function chunkSize(): int
{
    return 1000;
}

}`

enhancement

Komentar yang paling membantu

Saya mulai mengerjakan PR tetapi segera menyadari bahwa itu akan rumit untuk diterapkan. @patrickbrouwers akan meninjau basis kode untuk melihat apa cara terbaik ke depan.

Sementara itu saya hanya menggunakan metode pembantu pada objek Impor saya:

/**
 * Transform a date value into a Carbon object.
 *
 * <strong i="8">@return</strong> \Carbon\Carbon|null
 */
public function transformDate($value, $format = 'Y-m-d')
{
    try {
        return \Carbon\Carbon::instance(\PhpOffice\PhpSpreadsheet\Shared\Date::excelToDateTimeObject($value));
    } catch (\ErrorException $e) {
        return \Carbon\Carbon::createFromFormat($format, $value);
    }
}
class Sample implements ToModel
{
    public function model(array $row)
    {
        return new user([
            'name' => $row[0],
            'email' => $row[1],
            'birth-date' => $this->transformDate($row[2]),
        ]);
    }
}

Semua 38 komentar

Belum diuji, tetapi saya yakin Anda perlu melakukan:

 return new user([
        'UserName'           => $row['UserName'],
        'Password'           => $row['Password'],
        'date'               => \PhpOffice\PhpSpreadsheet\Shared\Date::excelToDateTimeObject($row['date']),
    ]);

Saya ingat setReadDataOnly menyebabkan masalah dalam beberapa situasi lain, jadi saya tidak nyaman hanya menambahkannya lagi. Mungkin kita bisa membuatnya menjadi perhatian atau sesuatu.

Saya juga mengalami masalah ini. excelToDateTimeObject mengembalikan tanggal sebenarnya tetapi mungkin baik untuk memiliki perhatian untuk ini.

Mungkin sesuatu seperti:

    interface WithDateObjects
    {
        /**
         * An array of columns to convert to DateTime Objects.
         * Either named column headers or coordinate columns.
         *
         * <strong i="8">@return</strong> array
         */
        public function dateColumns(): array;
    }

    class MyImport implements WithDateObjects
    {
        public function dateColumns(): array
        {
            return ['birthday', 'wedding_date'];
        }
    }

Kemudian laravel excel akan mendeteksi jika impor mengimplementasikan WithDateObjects dan mengatur \PhpOffice\PhpSpreadsheet\Shared\Date::excelToDateTimeObject($this->cell->getValue()) sesuai kebutuhan?

PS: Haruskah ini dikonversi ke Karbon?

Saya akan menerima PR yang menambahkan kekhawatiran WithDates yang mengembalikan tanggal Carbon ;)

baik saya mendapatkan masalah juga, sebelum itu berfungsi dengan baik dan sekarang saya mendapat kesalahan unexpected data found , dan bahkan ketika saya menambahkan ini

\PhpOffice\PhpSpreadsheet\Shared\Date::excelToDateTimeObject($row['date'])

dan masih error

A non well formed numeric value encountered

juga mencoba mengubahnya dengan karbon tetapi tidak berhasil

$row['date'] bukan bilangan bulat. excelToDateTimeObject hanya berfungsi ketika tanggal diformat sebagai tanggal di excel.

hmmm itu sudah diformat pada tanggal

screen shot 2018-10-25 at 16 48 06

saya menggunakan "maatwebsite/excel": "^3.1",

Coba debugnya, lihat apa yang ada di $row['data'] .

Saya dapat mengirim PR dengan WithDates tetapi itu akan menjadi setidaknya seminggu. Saya di konferensi dan tidak bisa fokus pada itu sekarang.

itu 1/1/18 itu harus secara otomatis dikonversi dari tanggal excel ke tanggal di tabel mysql kan? saya menggunakan paket ini sebelumnya dan berfungsi hanya menemukan ... tetapi sekarang mendapatkan kesalahan ini

Jika Anda mendapatkan kembali 1/1/18 , itu jelas bukan bilangan bulat :) Jadi Anda tidak boleh menggunakan excelToDateTimeObject . Alih-alih, Anda perlu menggunakan Carbon::createFromFormat(...) untuk menangani ini

@patrickbrouwers Mungkin kekhawatiran withDates pertama-tama dapat mencoba excelToDateTimeObject dan jika itu menimbulkan pengecualian, coba Carbon::createFromFormat(). Metode dateColumn dapat menunjukkan format tanggal.

public function dateColumns(): array
        {
            return ['birthday' => ‘d/m/Y’, 'wedding_date'];
        }

Ps: Saya mencoba menulis kode ini di ponsel saya, saya tidak tahu bagaimana cara melakukan back ticks

@devinfd Kedengarannya bagus :)

ps memperbaiki kutu punggung Anda;)

@devinfd seberapa jauh Anda dengan implementasinya? Akan tertarik juga.

Saya mulai mengerjakan PR tetapi segera menyadari bahwa itu akan rumit untuk diterapkan. @patrickbrouwers akan meninjau basis kode untuk melihat apa cara terbaik ke depan.

Sementara itu saya hanya menggunakan metode pembantu pada objek Impor saya:

/**
 * Transform a date value into a Carbon object.
 *
 * <strong i="8">@return</strong> \Carbon\Carbon|null
 */
public function transformDate($value, $format = 'Y-m-d')
{
    try {
        return \Carbon\Carbon::instance(\PhpOffice\PhpSpreadsheet\Shared\Date::excelToDateTimeObject($value));
    } catch (\ErrorException $e) {
        return \Carbon\Carbon::createFromFormat($format, $value);
    }
}
class Sample implements ToModel
{
    public function model(array $row)
    {
        return new user([
            'name' => $row[0],
            'email' => $row[1],
            'birth-date' => $this->transformDate($row[2]),
        ]);
    }
}

Juga memiliki masalah dengan ini.

@devinfd
Saya menggunakan fungsi pembantu Anda untuk memformat tanggal saya. Ia kembali dalam format ini 1943-10-15 00:00:00

Apakah saya bisa mengembalikannya sebagai 10/15/1943 ?

Atau apakah lebih baik menangani jenis pemformatan itu di ujung depan?

Saya ingin tahu, apakah ada yang ingin/mengharapkan/memiliki kasus penggunaan untuk....bidang tanggal untuk kembali sebagai bilangan bulat aneh ini? Tampaknya hal ini harus terjadi secara otomatis saat diimpor. Saya tidak dapat membayangkan skenario di mana tanggal yang dapat dilihat di excel sebagai "2019-01-10" akan kembali kepada saya sebagai 43473.0

@nickpoulos begitulah cara Excel menyimpannya ketika format angka adalah format tanggal.
PhpSpreadsheet mencoba mengubahnya menjadi objek datetime, lihat NumberFormat baris 649. Jika gagal, tidak banyak yang bisa kita lakukan.

Bagaimana Anda bisa memvalidasi bahwa tanggalnya kosong?

Siapa saja dapat memposting kode status kemajuan, pada file excel impor.

Apakah ada yang memecahkan masalah??

Apakah ada yang memecahkan masalah??

@Jaikangam93
Sedikit terlambat, tetapi saya kebetulan memperbaikinya dengan bantuan _WithCustomValueBinder_ menulis sedikit cek untuk koordinat kolom tanggal dan menggunakan metode excelToDateTimeObject pada PhpOffice\PhpSpreadsheet\Shared\Date dan akhirnya menetapkan nilai untuk sel sebagai string.

Berikut kodenya:

   public function bindValue(Cell $cell, $value)
   {
       if(preg_match('/^E*\d*$/', $cell->getCoordinate())){
                $cell->setValueExplicit(Date::excelToDateTimeObject($value)->format('Y-m-d'), DataType::TYPE_STRING);
        }
        else{
            $cell->setValueExplicit($value, DataType::TYPE_STRING);
        }

        return true;
    }

Pastikan untuk mengimpor semua ruang nama dan menerapkan _WithCustomValueBinder_ pada importir.

Saya punya masalah, saya mengimpor file yang di beberapa sel dapat memiliki nilai apa pun (numerik, string, tanggal ...), bagaimana saya bisa tahu bahwa nilai asli di sel itu adalah tanggal, jadi saya bisa memformatnya benar?

Anda harus mengetahui secara spesifik kolom apa yang akan berisi entri tanggal dan kemudian mereferensikan yang sama dalam perbaikan Anda. Jika Anda menggunakan Judul, Anda dapat memeriksa dengan kunci kolom. Umumnya mencari tahu nilai tanggal akan mudah jika generik, tetapi dengan excel, ia menyimpan tanggal sebagai stempel waktu excel yang pada dasarnya adalah string. Apa yang dapat Anda lakukan adalah mencari tahu pola pada stempel waktu dan karenanya melakukan pemeriksaan untuk setiap kolom dan jika ada kecocokan, Anda dapat melanjutkan dengan pemformatan.

Dari apa yang saya lihat stempel waktu excel umumnya memiliki pola _ \d*\.\d _ yang merupakan sekelompok digit diikuti oleh titik dan kemudian digit lainnya.

Semoga membantu.

Itu tidak mungkin, data dalam kolom ini dapat memiliki tipe nilai apa pun (angka, tanggal, string) dan saya tidak dapat mengetahuinya sebelumnya, data ini akhirnya dimuat ke dalam bidang json. Dan itu bisa menjadi nilai yang sempurna seperti 42434,12 dan bukan tanggal.

Saya mulai mengerjakan PR tetapi segera menyadari bahwa itu akan rumit untuk diterapkan. @patrickbrouwers akan meninjau basis kode untuk melihat apa cara terbaik ke depan.

Sementara itu saya hanya menggunakan metode pembantu pada objek Impor saya:

/**
 * Transform a date value into a Carbon object.
 *
 * <strong i="9">@return</strong> \Carbon\Carbon|null
 */
public function transformDate($value, $format = 'Y-m-d')
{
    try {
        return \Carbon\Carbon::instance(\PhpOffice\PhpSpreadsheet\Shared\Date::excelToDateTimeObject($value));
    } catch (\ErrorException $e) {
        return \Carbon\Carbon::createFromFormat($format, $value);
    }
}
class Sample implements ToModel
{
    public function model(array $row)
    {
        return new user([
            'name' => $row[0],
            'email' => $row[1],
            'birth-date' => $this->transformDate($row[2]),
        ]);
    }
}

Bekerja seperti Mantra. Terima kasih

@vin33t @patrickbrouwers
Periksa bidang kosong terlebih dahulu (sebelum mencoba / tangkap), jika tidak, fungsi akan mengembalikan tanggal 1970-01-01 jika kosong:

if(!strlen($value)) return null;

Hai, saya menemukan solusi ini, bekerja untuk saya!

protected function formatDateExcel($date){ if (gettype($date) === 'double') { $birthday = \PhpOffice\PhpSpreadsheet\Shared\Date::excelToDateTimeObject($date); return $birthday->format('n/j/Y'); } return $date; }

dan saya menggunakan

$this->formatDateExcel($row['birthday']);

Adakah yang bisa menjelaskan cara menangani 04/04/1977 seperti dalam format m/d/Y ?

Date::excelToDateTimeObject($row['birth_date'])

seperti yang saya lihat itu tidak menerima argumen format?

untuk tujuan demo:

'birthday' => $row['birth_date'] ? Date::excelToDateTimeObject($row['birth_date']) : null,

Dan tentunya kita disana 04/04/1977 saya dapat 0000-00-00.... , karena tidak tahu bulan dan hari apa :man_facepalming:

DIPERBARUI :
Nevermind Ternyata masalah ini hanya untuk orang-orang yang ulang tahunnya di bawah tahun 1970...

Pengeditan kedua mengubah jenis kolom dari timestamp menjadi dateTime - kasus ditutup.

Saya ingin mengimpor file excel dengan kolom tanggal, tetapi saya mengalami kesalahan antara format 1992/03/01 yang dibuat 1992-03-01, atau adakah cara lain untuk mengatasinya?
Tolong bantu saya mengatasi masalah ini.

Saya ingin mengimpor file excel dengan kolom tanggal, tetapi saya mengalami kesalahan antara format 1992/03/01 yang dibuat 1992-03-01, atau adakah cara lain untuk mengatasinya?
Tolong bantu saya mengatasi masalah ini.

Hai nizardani,
Coba seperti ini, pada file Excel Anda Edit pada kolom kolom tanggal 1992-03-01.
Tanggal 1992-03-01 ini tidak akan diterima oleh Laravel Excel sehingga Anda perlu memperbarui/mengubah jenis kolom kolom.
Langkah penyelesaian :-
1) Buka file excel untuk Impor. Pilih kolom tanggal Klik Kanan, pilih Format Cell
2) Format sel> Angka> Kustom> Ketik> hh-mm-yyyy jj:mm:dd
Contoh akan seperti ini > 03-06-2018 00:00:00
Setelah mengubah sel Format. Jika muncul seperti 03-06-2018.
Pastikan kamu double klik sehingga berubah menjadi seperti ini 06-03-2018 00:00:00.

Sekali lagi Impor File.... Saya harap ini akan berhasil sekarang.

Saya ingin mengimpor file excel dengan kolom tanggal, tetapi saya mengalami kesalahan antara format 1992/03/01 yang dibuat 1992-03-01, atau adakah cara lain untuk mengatasinya?
Tolong bantu saya mengatasi masalah ini.

Hai nizardani,
Coba seperti ini, pada file Excel Anda Edit pada kolom kolom tanggal 1992-03-01.
Tanggal 1992-03-01 ini tidak akan diterima oleh Laravel Excel sehingga Anda perlu memperbarui/mengubah jenis kolom kolom.
Langkah penyelesaian :-

  1. Buka file excel untuk Impor. Pilih kolom tanggal Klik Kanan, pilih Format Cell
  2. Format sel> Angka> Kustom> Ketik> hh-mm-yyyy jj:mm:dd
    Contoh akan seperti ini > 03-06-2018 00:00:00
    Setelah mengubah sel Format. Jika muncul seperti 03-06-2018.
    Pastikan kamu double klik sehingga berubah menjadi seperti ini 06-03-2018 00:00:00.

Sekali lagi Impor File.... Saya harap ini akan berhasil sekarang.

15788022402754767278257596482531
Saya mendapatkan masalah lagi setelah saya mengubah jenis tanggal di excel, apa yang harus saya gunakan nesbot karbon?

Jadi, adakah yang berhasil mengetahui cara memberi tahu sel adalah format tanggal sebelum memutuskan apakah perlu dikonversi ke objek tanggal atau datetime? Excel jelas tahu, karena bidang tanggal yang disimpan akan kembali sebagai bidang tanggal saat spreadsheet dimuat lagi ke Excel. Jadi harus ada beberapa metadata untuk sel itu yang dapat memberi tahu kita bahwa itu adalah sel yang berisi tanggal.

Mengintip cepat, dan itu ada di lembar kerja:

<worksheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:x14ac="http://schemas.microsoft.com/office/spreadsheetml/2009/9/ac" xmlns:xr="http://schemas.microsoft.com/office/spreadsheetml/2014/revision" xmlns:xr2="http://schemas.microsoft.com/office/spreadsheetml/2015/revision2" xmlns:xr3="http://schemas.microsoft.com/office/spreadsheetml/2016/revision3" mc:Ignorable="x14ac xr xr2 xr3" xr:uid="{A7382266-55D2-4E6B-95C9-90E61705D12D}">
   ...
   <sheetData>
      <row r="4" spans="1:1" x14ac:dyDescent="0.25">
         <c r="A4">
            <v>54321</v>
         </c>
      </row>
      <row r="5" spans="1:1" x14ac:dyDescent="0.25">
         <c r="A5" s="1">
            <v>43924</v>
         </c>
      </row>
   </sheetData>
   ...
</worksheet>

Sel A4 adalah bilangan bulat, dan sel A5 adalah tanggal. Perbedaannya adalah atribut s="1" . Itu membuatnya menjadi kencan. Jika saya menambahkan atribut ini ke sel A4 dengan mengedit Book1.xlsx , membuka spreadsheet memberi saya dua tanggal. 54321 adalah 20 September 2048, jika Anda bertanya-tanya ;-)

Jadi datanya ada di spreadsheet untuk menginformasikan perpustakaan ini bahwa angka ini bukan angka, tapi tanggal. Saya belum melihat ini dalam spesifikasi, jadi saya berharap ada lebih banyak kehalusan yang terlibat dari itu, tetapi intinya adalah, aplikasi yang mengimpor spreadsheet tidak harus tahu apa tipe datanya terlebih dahulu.

Pembaruan: jawaban yang sangat bagus di sini s=1 melewati beberapa referensi pengalihan di styles.xml dan akhirnya memberi Anda format internal atau format khusus. Saya menduga format tampilan adalah semua yang Anda harus menentukan apakah niatnya adalah agar nomor itu menjadi kencan. Beberapa format internal cukup mudah untuk dikodekan, tetapi format khusus akan sedikit lebih sulit untuk didekodekan.

PhpSpreadsheet memang tahu tentang format ini. Namun untuk alasan kinerja, disarankan untuk membaca file Excel dalam mode read_only. Jika Anda dapat menonaktifkannya di sini: https://github.com/Maatwebsite/Laravel-Excel/blob/3.1/config/excel.php#L47 PhpSpreadsheet kemudian harus membaca tanggal sebagai tanggal secara otomatis. Jika Anda lebih suka pengaturan yang lebih berkinerja, Anda dapat memformat tanggal sendiri menggunakan PhpOffice\PhpSpreadsheet\Shared\Date::excelToDateTimeObject($date)

Belum diuji, tetapi saya yakin Anda perlu melakukan:

 return new user([
        'UserName'           => $row['UserName'],
        'Password'           => $row['Password'],
        'date'               => \PhpOffice\PhpSpreadsheet\Shared\Date::excelToDateTimeObject($row['date']),
    ]);

Saya ingat setReadDataOnly menyebabkan masalah dalam beberapa situasi lain, jadi saya tidak nyaman hanya menambahkannya lagi. Mungkin kita bisa membuatnya menjadi perhatian atau sesuatu.

Sayangnya metode ini mengubah tanggal saya menjadi 1900-01-08

jika kebutuhan Anda melibatkan penyelesaian bidang datetime secara dinamis, saya telah menulis metode yang bertanggung jawab untuk secara otomatis mendeteksi apakah nilainya adalah datetime secara dinamis (terlepas dari apakah Anda tahu apakah akan ada datetime di kolom itu atau tidak) atau saya telah mencoba berbagai tipe data dan berfungsi dengan baik

       /**
     * <strong i="6">@param</strong> Cell $cell
     * <strong i="7">@param</strong> $value
     * 
     * <strong i="8">@return</strong> boolean;
     */
    public function bindValue(Cell $cell, $value)
    {
        $formatedCellValue = $this->formatDateTimeCell($value, $datetime_output_format = "d-m-Y H:i:s", $date_output_format = "d-m-Y", $time_output_format = "H:i:s" );
        if($formatedCellValue != false){
            $cell->setValueExplicit($formatedCellValue, DataType::TYPE_STRING);
            return true;
        }

        // else return default behavior
        return parent::bindValue($cell, $value);
    }


    /**
     * 
     * Convert excel-timestamp to Php-timestamp and again to excel-timestamp to compare both compare
     * By Leonardo J. Jauregui ( <strong i="9">@Nanod10</strong> | siskit dot com )
     * 
     * <strong i="10">@param</strong> $value (cell value)
     * <strong i="11">@param</strong> String $datetime_output_format
     * <strong i="12">@param</strong> String $date_output_format
     * <strong i="13">@param</strong> String $time_output_format
     * 
     * <strong i="14">@return</strong> $formatedCellValue
     */
    private function formatDateTimeCell( $value, $datetime_output_format = "Y-m-d H:i:s", $date_output_format = "Y-m-d", $time_output_format = "H:i:s" )
    {

        // is only time flag
        $is_only_time = false;

        // Divide Excel-timestamp to know if is Only Date, Only Time or both of them
        $excel_datetime_exploded = explode(".", $value);

        // if has dot, maybe date has time or is only time
        if(strstr($value,".")){
            // Excel-timestamp to Php-DateTimeObject
            $dateTimeObject = \PhpOffice\PhpSpreadsheet\Shared\Date::excelToDateTimeObject($value);
            // if Excel-timestamp > 0 then has Date and Time 
            if(intval($excel_datetime_exploded[0]) > 0){
                // Date and Time
                $output_format = $datetime_output_format;
                $is_only_time = false;
            }else{
                // Only time
                $output_format = $time_output_format;
                $is_only_time = true;
            }
        }else{
            // Only Date
            // Excel-timestamp to Php-DateTimeObject
            $dateTimeObject = \PhpOffice\PhpSpreadsheet\Shared\Date::excelToDateTimeObject($value);
            $output_format = $date_output_format;
            $is_only_time = false;
        }

        // Php-DateTimeObject to Php-timestamp
        $phpTimestamp = $dateTimeObject->getTimestamp();

        // Php-timestamp to Excel-timestamp
        $excelTimestamp = \PhpOffice\PhpSpreadsheet\Shared\Date::PHPToExcel( $phpTimestamp );

        // if is only Time
        if($is_only_time){
            // 01-01-1970 = 25569
            // Substract to match PhpToExcel conversion
            $excelTimestamp = $excelTimestamp - 25569;
        }

        /* 
        // uncoment to debug manualy and see if working
        $debug_arr = [
                "value"=>$value,
                "value_float"=>floatval($value),
                "dateTimeObject"=>$dateTimeObject,
                "phpTimestamp"=>$phpTimestamp,
                "excelTimestamp"=>$excelTimestamp,
                "default_date_format"=>$dateTimeObject->format('Y-m-d H:i:s'),
                "custom_date_format"=>$dateTimeObject->format($output_format)
            ];

        if($cell->getColumn()=="Q"){
            if($cell->getRow()=="2"){
                if(floatval($value)===$excelTimestamp){
                    dd($debug_arr);
                }
            }
        }

        */

        // if the values match
        if( floatval($value) === $excelTimestamp ){
            // is a fucking date! ;)
            $formatedCellValue = $dateTimeObject->format($output_format);
            return $formatedCellValue;
        }else{
            // return normal value
            return false;
        }

    }

Halo. Saya memiliki masalah yang sama. Saya menggunakan antarmuka ToCollection.

Metode public function collection(Collection $collection) dideklarasikan ok dan dipanggil dan memiliki semua pemrosesan.

Masalah : Dalam metode collection(), satu sel datetime diubah menjadi angka, bukan string datetime. Bagaimana cara menonaktifkan konversi ini? Itu tidak mengerti format nilai. Dan saya tidak dapat memodifikasi file XLS.

class MyImport implements WithCustomValueBinder, ToCollection
— tidak berfungsi juga untuk saya, karena bindValues tidak dipanggil sebelum koleksi();

ToModel saya tidak bisa menggunakan, karena sudah menerapkan koleksi (). Dan format XLS tidak linier. Perlu pemrosesan khusus.

Halo, masalah serupa di sini. Saya ingin menggunakan validator laravel untuk memeriksa format tanggal tertentu dan memastikannya sebelum bidang tanggal lain. Apakah ini mungkin? Satu-satunya solusi yang saya temukan sejauh ini adalah menyimpan sel waktu tanggal sebagai string dalam file xlsx dan menjalankan validator seperti ini:

public function rules(): array
    {
        return [
            'start' => 'required|date_format:d/m/y H:i|before:*.end',
            'end' => 'required|date_format:d/m/y H:i|after:*.end',
        ];
    }

Ya, saya juga secara manual mengubah format sel menjadi String dan kemudian mem-parsing ok. Tetapi saya tidak dapat selalu mengubah file xls, karena mereka akan dialirkan secara teratur dengan format sel Dateteme.

Masalah masih berlanjut.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat