Laravel-excel: Laravel 4.2/Laravel-Excel 1.3: Angka yang diformat sebagai teks masih muncul sebagai angka

Dibuat pada 3 Des 2015  ·  38Komentar  ·  Sumber: Maatwebsite/Laravel-Excel

Saya telah bermain-main dengan ini selama beberapa hari tetapi tidak bisa membuatnya bekerja. Saya memiliki beberapa nomor panjang (16 digit) yang disimpan di database saya yang kemudian saya gunakan fungsi toArray() untuk membuat spreadsheet excel xlsx saya. Kode yang saya gunakan untuk memformat kolom:
$sheet->setColumnFormat(array( 'A' => '@' ));

Namun angka-angka tersebut ditampilkan dalam excel sebagai angka dan mereka disingkat dengan notasi ilmiah.

Apakah ada yang bisa saya lakukan tentang ini di luar menambahkan spasi di kedua sisi?

Saya mengetahui batas 15 digit excel namun ketika memformat sebagai teks saya dituntun untuk percaya ini tidak akan menjadi masalah.

Komentar yang paling membantu

$excel->sheet('staff', function ($sheet) use ($data) {
$sheet->setColumnFormat(array(
'H' => '@',
));
$sheet->rows($data,true);
});

Semoga ini membantu ;)

Semua 38 komentar

Masalah yang sama di sini, namun dalam kasus saya ini adalah 14 digit Strings.

Jika Anda ingin menghindari notasi ilmiah untuk angka panjang di Excel, maka Anda perlu mengatur format mask yang secara eksplisit menampilkan nilai-nilai tersebut sebagai angka..... menggunakan @ hanya memberitahu MS Excel untuk menggunakan perilaku defaultnya (yaitu menggunakan format ilmiah untuk angka yang lebih panjang).... Saya sarankan Anda menggunakan format mask #0 sebagai gantinya

Bahkan kemudian itu tidak berfungsi. Inilah yang saya coba: $sheet->setColumnFormat(['id'=> '#0']);. Saya juga menduga setColumnFormat tidak berfungsi dengan baik dengan CSV karena saya sudah mencoba sejumlah format dan itu tidak terlalu berpengaruh pada format kolom.

Saya tidak tahu apakah ini membuat perbedaan, namun, saya telah menggunakan $sheet->fromModel($result); dan saya mencoba $sheet->fromArray($result->toArray()) dan keduanya menghasilkan masalah ini.

Bagi mereka yang memiliki masalah dengan CSV ini, saya membuat metode berikut:

fungsi publik getStringIdAttribute()
{
return '="' . $this->id . '"';
}
dan di bagian atas model saya, saya menambahkan:
protected $tambahkan = ['string_id'];

dan itu memaksa nomor tersebut untuk ditampilkan sebagai teks di Excel (serta Kingsoft Spreadsheets).

Jika Anda menulis ke CSV dan melihat melalui Excel, CSV tidak menyimpan format mask dan Excel akan menampilkan hasilnya sebagai angka menggunakan format defaultnya (ilmiah untuk nilai yang lebih besar)..... selalu periksa CSV menggunakan editor teks

Saya mencoba mengekspor file menggunakan "#0" sebagai format kolom tetapi mengubah digit terakhir menjadi 0. Jika @ adalah pengidentifikasi untuk 'default' lalu bagaimana saya bisa mencantumkan sel hanya sebagai teks sehingga excel tidak menyentuh apa pun ?

Saat ini solusi saya mengekspor dari laravel-Excel sebagai csv dan kemudian saya menggunakan skrip python yang saya tulis untuk mengekspor sebagai xlsx karena openpyxl tampaknya dapat memformat sebagai teks dengan benar.

Apakah ada perbaikan untuk perilaku ini? Saya mengekspor ke XSLX dari array di mana saya memiliki string seperti "10E00" yang diekspor sebagai nomor "10" di excel. setColumnFormat "@" tidak berfungsi untuk saya ...

@lachyn Saya tidak pernah menemukan perbaikan yang baik, seperti yang saya katakan di atas solusi yang akhirnya saya gunakan adalah mengekspor sebagai dari laravel CSV kemudian menjalankan perintah Shell untuk mengonversi output ke xlsx dengan skrip python.

@lszanto tapi ini aneh, bahkan jika saya mengekspornya ke "CSV" saya memiliki nilai "10" bukan "10E00", dan saya yakin bahwa dalam array saya adalah string "10E00"....

@lacyn Dengan apa Anda membuka CSV? Jika itu hanya editor teks maka mungkin laravel menyentuh sesuatu yang lain karena CSV seharusnya hanya menjadi output mentah, tidak ada pengubah atau apa pun.

Jika Anda mau dan datanya tidak pribadi, Anda dapat memposting sampel dan saya akan mencobanya ketika saya mendapat kesempatan.

@lszanto editor teks luhur...
Saya melakukan kueri dengan toArray() di akhir. Jika saya membuang array ini, dengan "10E00", setelah ekspor ... "10". Ekspor dilakukan dari larik ini, jadi semua mutator dilakukan dalam kueri.... Jadi harus diubah selama ekspor.

@lszanto mungkin saya menemukan penyebab masalah ini. Jika saya menghapus baris tajuk dari ekspor saya

  $sheet->prependRow(..)

itu berfungsi sekarang seperti yang diharapkan .... jadi mungkin fungsi ini entah bagaimana merusak pemformatan. Mencoba menghasilkan lembar dari model atau dari array, hasil yang sama.

Excel::create('sklad_vyrobku-'.date('d-m-Y', time()), function($excel) use ($table) {
            $excel->sheet('Sklad vyrobku k '.date('d-m-Y', time()), function($sheet) use ($table) {                                         
                 $sheet->fromModel($table, null, 'A1', false, false);
                     $sheet->prependRow(array('id','kod','...'));
                 $sheet->setColumnFormat(array('B'=>'@','C'=>'@','D'=>'@','E'=>'@'));
            });
         })->download('xlsx');

Saya memiliki masalah yang sama (Laravel 4.2), tetapi diselesaikan dengan memanggil setColumnFormat segera setelah membuka $excel->sheet function closure.
Jadi saya tidak berpikir ini adalah bug, hanya pendekatan logika.

Contoh:

$excel->sheet("FooBar", function($sheet) use ($x, $y, $z) {

    $sheet->setColumnFormat(array(
       "G:H" => "@",
       "Z" => "@",
       'AH:AI' => '0',
       "AO:BB" => "h:mm",
       "BE:BR" => "h:mm",
    ));

    ...

});

Saya masih mengalami masalah ini dan tidak ada solusi di atas yang berhasil untuk saya. Saya mengimpor data saya dari sebuah array dan sementara semua nilai di sana adalah strings , saya berpikir bahwa setColumnFormat masih akan melakukan tugasnya dan mengubah sel menjadi Number Format , itu tidak terjadi meskipun.
Cara saya menyelesaikannya adalah dengan mengetik semua nilai dalam array saya ke dalam float/ints sebelum menggunakan metode fromArray untuk mengimpor data ke dalam sheet.

Jadi, jika tidak ada yang berhasil untuk Anda, pastikan data yang Anda impor memiliki jenis yang tepat sebelum memasukkannya ke dalam lembar. Semoga ini bisa membantu seseorang :)

Saya menemukan solusi dengan menggunakan setCellValueExplicit()
misalnya:

$sheet->setColumnFormat(array( //se formatea la columna a texto
    'C' => \PHPExcel_Style_NumberFormat::FORMAT_TEXT,
    'I' => 'dd-mm-yyyy hh:mm'
));

$sheet->setCellValueExplicit('C10', $object->card_number, \PHPExcel_Cell_DataType::TYPE_STRING);

Semoga ini membantu ;)

$excel->sheet('staff', function ($sheet) use ($data) {
$sheet->setColumnFormat(array(
'H' => '@',
));
$sheet->rows($data,true);
});

Semoga ini membantu ;)

Saya masih dengan masalah yang sama. Sebenarnya, itu mengubah format (font) tetapi bukan format data.
captura de pantalla 2017-04-04 a las 11 11 39 a m
captura de pantalla 2017-04-04 a las 11 05 19 a m
captura de pantalla 2017-04-04 a las 11 12 58 a m

Apakah bug atau saya melakukannya dengan cara yang salah?

@minkadev
$sheet->rows($data, true) menambahkan semua aturan "eksplisit". Ini berarti akan ditambahkan sebagai string dan dengan demikian pemformatan kolom akan diabaikan.

Terima kasih @patrickbrouwers.
Saya juga mencoba dengan:

$sheet->fromArray($data, null, 'A1', false, false);

Pikir saya menemukan mengapa itu tidak berhasil, tidak yakin mengapa itu pernah ditambahkan: https://github.com/Maatwebsite/Laravel-Excel/blob/2.1/src/Maatwebsite/Excel/Classes/LaravelExcelWorksheet.php#L1262 Itu menambahkan numerik&bilangan bulat sebagai nilai "string" juga.

Jadi itu tidak akan berhasil? :(

Hanya saja, jangan setel $sheet->rows($data, true); eksplisit menjadi true.

Menggunakan:

$sheet->rows($data);

$sheet->fromArray($data, null, 'A1', false, false); bekerja dengan baik untuk saya juga.

Masih tidak bekerja. Plus, bagaimana saya bisa memformat kolom menggunakan:
$sheet->fromArray($data, null, 'A1', false, false);

Kode contoh Anda dengan $sheet->rows($data); berfungsi dengan baik untuk saya. Pemformatan kolom benar ketika saya membukanya di Excel.

Itu aneh. Masih tidak bekerja:
captura de pantalla 2017-04-05 a las 11 15 20 a m
captura de pantalla 2017-04-05 a las 11 13 48 a m
Saya memiliki versi yang tepat? (v2.1.16)

Siapapun?.. Saya masih mengalami masalah ini...

Di Laravel 5.3, maatwebsite/excel 2.1.12

Saya dapat membuatnya bekerja dengan dua perubahan berikut

  1. @LastxTemplar saran untuk memasukkan nomor ke float atau int
  2. menempatkan setColumnFormat() segera setelah membuka $excel->sheet function closure, per @nikola-absolute

Saya mendapat masalah ini baru-baru ini, saya mencoba menggunakan metode setColumnFormat tetapi tidak berhasil untuk saya.
Ini adalah solusi saya:

foreach (...) {
    $sheet->row($row, [
        /* Your Data */
    ]);
    $sheet->setCellValueExplicitByColumnAndRow($column, $row, $value, \PHPExcel_Cell_DataType::TYPE_STRING);
}

Catatan jenis $column dan $row adalah integer , referensi di sini .

Di Laravel 5.1, maatwebsite/excel 2.1.0
Saya bisa membuatnya bekerja hanya dengan melemparkan nomor ke float atau int
:(
Jadi saya harus mengulang untuk setiap baris untuk mencapai itu.

Juga mengalami masalah ini. Ada pembaruan yang akan datang?

Sunting: baru saja diperbaiki juga dengan solusi @neighborhood999

Semua sampel di sini berbicara tentang mengekspor ke excel,bagaimana dengan impor dari sampel excel?

nilai->imei_1 = 356803081142590;

tapi saya akhirnya mendapatkan imei_1 sebagai "3.5680308104231E+14"

<?php

$path = $request->file('excel')->getRealPath();
$data = Excel::load($path, function ($reader) {
})->get(['brand', 'model', 'batch', 'imei_1', 'imei_2']);

if (!empty($data) && $total = $data->count()) {
    foreach ($data as $key => $value) {
              $insert[] = ['brand' => $value->brand,
                           'model' => $value->model,
                           'batch' => $request->batch ? $request->batch : $value->batch,
                           'imei_1' => strval($value->imei_1),
                           'imei_2' => strval($value->imei_2),
                           'created_at' => Carbon::now(),
                           'updated_at' => Carbon::now()
                         ];
        }
    /*if (!empty($insert)) {
        Device::insert($insert);
        // dd('Insert Record successfully.');
    }*/
}

@ Ra1da35ma saya mendapatkan masalah yang sama. Apakah Anda berhasil dengan ini?

Saya telah mencoba mengatur pengikat nilai khusus tetapi itu tidak berfungsi karena nilai yang diikat ke sel sudah dalam notasi ilmiah. Saya dapat membuka masalah lain untuk mencoba dan menyelesaikan ini karena ini bukan masalah yang sama, tetapi mudah-mudahan Anda memiliki informasi lebih lanjut.

Saya telah menemukan perbaikan. Masalahnya ada hubungannya dengan PHP dan variabel presisi .ini yang dibaca oleh kelas PHPExcel_Calculation. Anda tidak dapat mengesampingkan ini dalam paket Laravel-Excel atau benar-benar dalam paket induknya PHPExcel. Sebagai gantinya, Untuk memperbaikinya saya baru saja menambahkan ini_set('precision', 20) sebelum saya memanggil fungsi beban Excel.

Ini adalah fungsi saya:

public function getXlsxFile($filePath)
    {
        ini_set('precision', 18);
        $collection = Excel::load($filePath);

        return $collection->get();
    }

Beginilah cara kerjanya untuk saya dengan laravel 5.1

$myFile= Excel::create($filename, function($excel) use($array) {
$excel->setTitle('judul');
$excel->sheet('sheet 1', function($sheet) use($array) {
$sheet->setColumnFormat(array('B'=>'0'));
$sheet->setColumnFormat(array('C'=>'0'));
$sheet->setColumnFormat(array('D'=>'0'));
$sheet->setColumnFormat(array('E'=>'0'));
$sheet->rows($array,false);
//set nama kolom
$sheet->prependRow(array(
'Nama Kolom 1', 'Kotak 1','Kotak 2','Kotak 3 ','Jumlah'
));
});
});

Kami menutup semua tiket lama, karena versi 2.* sudah mencapai tahap Akhir Hidup. Perhatian penuh kami sekarang dialokasikan ke versi 3.0. Masih dimungkinkan untuk menggunakan 2.*, tetapi tidak akan ada dukungan aktif lagi.

Casting nilai ke integer bekerja untuk saya.

Ini adalah jawaban terbaik, ketik cast variabel Anda dalam array sebelum meneruskannya ke metode ->fromArray : mis.
$local_order['Quantity'] = (int) $item->quantity;
$local_order['Price'] = (float) $item->price;

Apakah halaman ini membantu?
0 / 5 - 0 peringkat