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

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.

                Windows platformunda kullanmadığım için bir şey diyemem. İşlem yapılabilmesi için o dosyanın fiziksel konumuna ulaşılması gerekir.

                Benim fikrimi sorarsan bu tarz işleri javascript ile hallet inanılmaz seçenek var karşında. Ben böyle şeyleri laravel, php ile yapmam

                  hackerman Veritabanında olan bir bilgiyi yalnızca JS ile nasıl dışarı aktaracağın konusunda bizi aydınlatır mısın?

                    sineld Tabi ki api yardımıyla. Küçük bir post isteği yeterli olur güvenlik içinse JWT yeterli görüyorum bu iş için. Veriyi bastıktan hemen sonra tokenın süresi bitirilebilir expiration zamanını belirleyerek yada range tarzı parça parça gönderebilir. JS ile çok daha hızlı olacaktır. Sadece backend tarafında gerekli ayarlamalar yapılması yeterli yani belirli tarih aralığı veya ilgili sayfadaki veriler istendiğinde karşılaması yeterli..

                    Büyük bir veritabanından tüm veriler çekilecekse query builder' a direk bağlanabilir, socket ile event tetikleyebilir, veya queue ve jobs ile arkaplanda döndürür. Laravel echo bunu karşılıyor ayrıca birşey yapılmasına gerek yok javascriptte aynı php gibi. Son söylediklerim kullanıcıyı yüklenmekle bekletmemek içindi. Eğer masif birşeyse video işleme işlemi gibi süreci kişiden bağımsızlaştırmak gerekir. Belki indirmek için kendi dosyanıza buluta atmayı tercih edebilirsiniz o taraf projenin büyüklüğüne amacına kişinin insiyatifine bağlı.
                    Demek istediğim pdf, excel her ne olursa olsun php ile dinamik olmaz ama js ile istediğiniz yerine müdehal etmekte özgürsünüz. Belli bir kolonu tutup değiştirip veritabanına arayüzden yaptığınız değişikliği gönderebilirsiniz yani indirmeden arayüzdede düzenler. Ben php kullanmam böyle işlemlerde. Guzzle unirestte kullanmam bunlar javascriptte daha kolay ve güzel. Yani demek istediğim youtube , gdrive , twitter api yazacaksanız istekleri php ile yapmak bana biraz gereksiz geliyor.

                    Çok gerek olmaz ama farklı atraksiyonlar isteniyorsa arkaya node server kurulabilir ayrıyeten o işleme özel. Ben onu da deniyorum realtime search özelikleri için.

                    sineld Eskiden binary data I/O şeklindeymiş ama 2007 ve sonrasında binary yanında OOXML de gelmiş. O yüzden veritabanından gelen veri ya Excel binary verisine dönüştürülmeli ya da OOXML standartlarına göre XLSX formatına dönüştürülmeli. Sadece biriyle çalışan ya da ikisini de kullanan farklı dillerde kütüphaneler var. Büyük veri için genellikle CSV tercih ediliyor.

                    Eğer veri çok büyükse, oluşturulup excel yazıcıya gönderilmemeli. Onun yerine bellekte tutulmayıp dosyaya stream edilmeli. Data chunk ile parça parça kullanıcıya ya da arka planda dosyaya stream edilebilir ya da Exceljs gibi stream destekleyen kütüphanlerden çekilerek dosyaya yazılabilir. Bunları araştırabilirsiniz.