Laravel Türkiye Discord Kanalı Forumda kod paylaşılırken dikkat edilmesi gerekenler!Birlikte proje geliştirmek ister misiniz?

Merhaba,

Excelden veri okuma ve excele veri yazma konusunda örnek bir paket var mıdır ?

Normalde PHPExcel kullanıyordum. Bununla alakalı olarak Excel'den okuma özelinde şöyle bir sıkıntı vardı:

String olarak saklanması gereken rakamsal değerleri okurken rakamsal okuyup stringi bu şekilde veriyordu.

Bununla ilgili örnekleme yapmam gerekirse 100.50 olması gereken bir kodu => 10.050 olarak düzeltip bu şekilde çıktı alıyordu.

PHPExcel özelinde bu sorunu ,

class BindValueAsString extends PHPExcel_Cell_DefaultValueBinder implements PHPExcel_Cell_IValueBinder
{
    public function bindValue(PHPExcel_Cell $cell, $value = null)
    {
        $cell->setValueExplicit($value, PHPExcel_Cell_DataType::TYPE_STRING);
        return true;
    }
} 

Okuma yaparken de ;

PHPExcel_Cell::setValueBinder(new BindValueAsString()); olarak kullanım belirtiyoruz.

Sorunu bu şekilde çözebilmiştik. Aynı sorunu yeni excel okumasında da tanımlayabilmem gerekecek.

nawt12 belirttiği paketi projemizde yoğun olarak kullanıyoruz. Gayet kullanışlı bir paket tavsiye ederim.

@mgsmus @nawt12 #16679

Merhaba,

Laravel Excel benim de dikkatimi çekmişti. Okuma fırsatı yakalayamadım henüz. Ama sağlam bir dökümanı var diye gördüm. Teknik detaylarını bilmiyorum.

@msgumus Çok fazla kayıt okuma işlemi , hatta yazma işlemim olacak. 300bin satırı bulan veriler olacak. Bu verileri de job olarak oluşturup bir klasör altına yazmayı düşünüyorum. Supervisor bu kadar verinin işlenmesini tek bir job altında yapabilir mi ?

Fonksiyonel bir yapı kullanmak istiyorum. PHPExcel desteği kaldırdığı için yeteri kadar verim alamıyorum. Yüksek verilerde problem yaşıyorum.

Supervisor'ı karıştırmayın o yardımcı bir program, Laravel ya da job ile direkt ilgisi yok 🙂

İşlem tek bir Job altında yapılabilir, sadece kaynak kullanımı artar, süresi uzar ama sizin yaşadığınız sorun bunlar değil, aşırı mühendislik. Ortada sorun yokken sorun varmış gibi hareket ediyorsunuz. Önce bir yazın bir çalışsın, gözlemleyin. Sorun çıkarsa düzeltirsiniz.

    mgsmus

    🙂 Evet bu konuda kontrollü yaklaşıyorum sürekli , biraz da mesleğin getirdiği hastalık diyelim.

    nawt12

    Merhaba,

    Laravel Excel kullanmaya karar verdim. Şu konuda bir bilgi rica ediyorum. UsersImport class yapısı gibi , sürekli olarak import için modelleme yapmam mı gerekiyor ?

      YalcinSahin Evet. Laravel Excel, PhpSpreadsheet kütüphanesi üzerine kurulu bir paket. Kütüphaneyi modüler bir şekilde kullanmanızı sağlıyor. Aslında kendi export import yapmıyor yani. Eğer özelliklerini kullanmayacaksanız sadece PhpSpreadsheet ya da diğer tavsiye ettiğim paketi yükleyip kullanabilirsiniz.

        mgsmus

        Merhaba,

        Çok hakim misiniz bilmiyorum hocam ama , şu konuda bilginiz vardır diye ümit ediyorum.

        Disable intelligent formatting
        If you want to disable the intelligent formatting of values, you can extend your export class with \PhpOffice\PhpSpreadsheet\Cell\StringValueBinder. In this case all values are passed on as strings.

        use Maatwebsite\Excel\Concerns\WithCustomValueBinder;

        class UsersExport extends \PhpOffice\PhpSpreadsheet\Cell\StringValueBinder implements WithCustomValueBinder
        {

        }

        Bu kısımda belirtilen durumun , excelin otomatik düzeltmelerini devre dışı bırakması olarak algıladım. Yani 100.50 değerini 10.050 olarak otomatik biçimlendirmeyi iptal etmesi olarak da örnekleyebilirim. Bu konuyu doğru algılamış mıyım ?

        Not: Bu kısım sadece Export kısmında belirtilmiş. İmport kısmında böyle bir bilgi bulamadım. Okuduğum veriyi de formatlasın istemiyorum.

          YalcinSahin Formatlama işini yapan Excel. Siz değeri integer olarak Excel'e gönderirseniz hücreyi tamsayı şeklinde biçimlendiriyor. StringValueBinder sınıfı ise verinin Excel'e karakter ifade (string) olarak gönderilmesini sağlıyor, böylece Excel hücreyi biçimlendirmiyor. O yüzden import sırasında verinin otomatik biçimlendirilmesinden söz edemeyiz çünkü sizin tarafınızda veriyi içeri alırken biçimlendirme diye bir şey yok.

          Gelen veriyi siz elle biçimlendirmek istiyorsanız WithCustomValueBinder arayüzü import için de mevcut:
          https://docs.laravel-excel.com/3.1/imports/concerns.html

          Teorik konuşmak yerine küçük bir örnek hazırlayıp import/export işlemleri yapıp denerseniz daha iyi olur.

          Laravel Excel kullanan arkadaşlar bir şey soracağım:

          $array = Excel::toArray(new Model() , storage_path("excel.xlsx"));

          buradan dönen değer array(1) { [0]=> array(1005) niye bu şekilde ?

          Fazladan başa 1 array daha alıyor. Burada ek bir kullanım mı var ?

          class City extends Model
          {
          protected $fillable = [
          "Il","Ilce","Ulke","IlCode","IlceCode"
          ];
          }

          public function model(array $row)
          {
              return new City([
                  "Il"=> $row[0],
                  "Ilce"=> $row[1],
                  "Ulke"=> $row[2],
                  "IlCode"=>$row[3],
                  "IlceCode"=>$row[4]
              ]);
          }

          Sorduğunuzu yanlış anlamadıysam eğer her bir satır array olarak dönüyorsa onları veri tipi yapmak için mecbur bir dizi içerisine alıyordur. 3 tane diziyi tek bir değişkene atayın desem mecbur şöyle yaparsınız:

          $list = [
              ['a'], ['b'], ['c']
          ];

          değil mi? Böylece $list iterable bir değişken olmuş olur

            mgsmus

            Merhaba,

            PHPExcel de 1000 satır varsa 1000 düğümlü bir array döndürüyordu.

            LaravelExcel kullandığımda 1000 satırı array içerisine alıp da 1000 satırı gösteriyor.

            Kullanım şu şekilde oluyor:

            PHPExcel => $list = [0],[1],[2],[3]
            LaravelExcel => $list = [ [0],[1],[2],[3] ]

            LaravelExcel ' deki bu array ' ı neden kullandığını merak ettim. Çünkü farklı bir Excel yapısında direk düğüm sayısını döndüyordu.

              YalcinSahin Anladım, sanırım Excel'de tek dosyada birden fazla sayfa (sheet) olabildiği için oradaki 0 Sayfa 1 demek olabilir. excel.xlsx dosyasında sayfaya elle isim verip deneyin, öyle bir diziye çevirin, belki 0 yerine adını yazar.

                mgsmus

                Hocam yine tek kurşunla çözdünüz 🙂 Sheet ile alakalıymış.

                3 ay sonra

                @mgsmus Merhaba,

                Fast Excel de kullanmayı deniyorum.

                $collection = (new FastExcel)->import(storage_path('urunler.xls')); olarak okumaya çalıştığımda ,

                (Could not open C:\wamp64\www\Proje\storage\urunler.xls for reading.) şeklinde hata alıyorum.

                Diğer bir sorum ise import metodunu benden try-catch almamı istiyor. Phpstorm editöründen kaynaklı olduğunu düşünüyorum. Bu sorunu nasıl çözebilirim ?

                config - app kısmına

                "aliases" => 'FastExcel' => Rap2hpoutre\FastExcel\Facades\FastExcel::class, olarak da ekleme yaptım.

                Edit: sanım xls desteği yok , ama aynı dosyayı xlsx olarak da açamadım. (32 bin kayıt var)

                Dosya okuma hatası ile ilgili olanda dosya yolunun doğruluğundan ve okuma yazma izni olduğundan emin olun. Ona bir şey diyemiyorum.

                Editör try...catch... istiyorsa yapılan işlem exception fırlattığı içindir. Onu yakalayıp işlem yapmayacaksanız try...catch... kullanmanıza gerek yok. Uyarı görmemek için ise yöntemin PhpDoc bloğuna @throw {ilgili-exception} direktifini ekleyin.

                Rap2hpoutre\FastExcel paketi çok başarılı ve muadilleri arasında en az kaynak tüketimi ile öne çıkıyor, aktif bir projemde hem import hem de export için kullanıyorum.

                    (new FastExcel)
                        ->import(
                            public_path('uploads/'.$this->fileName),
                            function ($row) {
                            ....

                şeklinde tam path (veri yolu) vermelisiniz.

                @sineld @mgsmus #17849

                Merhaba,

                storage_path() , bunu kullandığımda direk storage klasörü altındaki verileri görüyor. Diğer projelerimde de aynısını kullanıyorum.(Laravel-Excel kullanıyorum) İnternette okuduğum birkaç yazıda da dosya yolu ile alakalı problemler bahsedilmiş. Sorunun box/spout için Windows'da dosya yolunu farklı şekilde okuması olarak yazanlar da vardı.

                Bazen anlık olarak excel okumam gerekiyor , modelleme yapmak istemiyorum. Fast-Excel için tekrardan deneme yapacağım. Şöyle bir durum da var. Tarayıcıda sürekli bekle veya sayfadan çık şeklinde uyarı alıyorum. Okuma yapamadığı için 1-2 dakikada bir böyle uyarı dönüyor sanırım.