Laravel OpenSpout — Fast Excel Export

Semih Keskin
Moneo
Published in
3 min readFeb 27, 2024

Bu yazıda Laravel projelerinizde excel export/import ihtiyacınız olduğunda kullanabileceğiniz OpenSpout paketini inceleyeceğiz. Fakat yazıda import üzerinde durmayacağım, daha çok export üzerinden ilerleyeceğim.

Toplulukta OpenSpout paketinin alternatifleri de var, fakat hepsi her ihtiyaca cevap veremeyebiliyor. Ayrıca yazıda neden bu paketi tercih etmeliyiz? Avantajları/Dezavantajları nelerdir? bunları konuşacağız.

Neden OpenSpout?

OpenSpout paketini üst düzey durumlara cevap bir paket olarak görebiliriz. Küçük verilerlerle çalışırken Laravel-Excel paketi gayet güzel bir seçenektir. Fakat olay küçük verilerden çıkıp 100.000–1.000.000 satır verileri rapora yazmaya geldiğinde imdat çığlıklarınıza OpenSpout paketi yetişecektir.

Soruyu hem örnekler üzerinden, hem de avantajları/dezavantajları üzerinden detaylandıralım.

Avantajlar

  • Yüksek yazma/okuma hızına sahiptir. Milyonlarca veriyi dakikalar içerisinde rapora yazabilir.
  • Dosya boyutu oldukça düşüktür. Laravel-Excel paketiyle kıyaslayınca “MB” yerine “KB” konuşmaya başlıyor.
ref: https://github.com/openspout/openspout/blob/4.x/docs/faq.md#how-long-does-it-take-to-generate-a-file-with-x-rows

Dezavantajlar

  • Çizelgeler ve formülleri desteklemez.
  • Paket oldukça basit tutulmuş. O yüzden kod üzerinde okunabirlik ve kullanım pratikliği Laravel-Excel paketine göre daha düşüktür. Laravel-Excel paketi, kendi içerisinde birçok şeyi kendi hallederken, OpenSpout ile arkada halledilen işleri sizin halletmeniz gerekiyor. Laravel’e başladıktan 3 yıl sonra ilk kez Pure PHP yazdığınızı varsayın :)

Openspout Kullanımı

Paketin avantajlarından bahsedersen görseldeki tabloda XLSX formatı için 6 milyon hücreye yazma hızı 8-10 dakika olarak belirtilmiş. Gerçekten ne kadar sürüyor, küçük bir gerçek hayat örneği üzerinden denemek istedim. Laravel'de Faker ile 3 milyon dummy kullanıcı datası oluşturdum.

Tüm veriyi çekip OpenSpout paketi ile excel raporuna yazdım. 3 milyon datayı tek seferde yazamayacağım için chunk ile 1000'er şekilde yazdırdım.

TestExcelExportRuntimeCommand

3 milyon veriyi ne kadarda yazıyor test etmek için küçük bir command yazdım.

Output

3 milyon veriyi excel raporuna yazma süresi

MySQL veritabanında users tablosundan 3 milyon kaydı (4 sütun: id, name, email, email_verified_at) tek seferde 54 saniyede çekiyor. Paketin FAQ kısmında 6 milyon hücreye yazma hızı 8–10 dakika olarak belirtilmişti.

3 milyon satır x satır başı 4 hücre = 12 milyon hücre

12 milyon hücreye yazma işlemini 140 saniye (2–3 dakika) içerisinde tamamladı. Verileri çekme süresini dahil etsek bile oldukça kısa sürede yazıyor.

NOT: Tabi her hücre içerisinde yazılan verilerin içeriği değiştikçe/büyüdükçe yazma süresi de doğru orantıda değişecektir. Buradaki amacımız aşağı yukarı gerçek hayat örnekleri üzerinden testlerimizi gerçekleştirmekti.

Dosya Boyutu

3 milyon satır, toplam 6 milyon hücresi dolu olan excel dosyasının boyutu ise diğer paketlerin oluşturduğu boyuta göre oldukça düşük, sadece 131.5 MB!

Sonuç

OpenSpout hız açısından çok iyi performans çıkarıyor. Özellikle büyük veri seti olduğunda kısa sürede yazma/okuma işlemlerini bitirmekle öne çıkıyor. Hatta OpenSpout, dosya boyutu ne kadar büyük olursa olsun 3 MB’den daha az memory kullanmayı vadediyor.

Kullanım kolaylığı açısından ise Laravel-Excel öne çıkıyor. OOP’den daha fazla yararlanmak ve hızlı iş çıkarmak istendiğinde Laravel-Excel tercih edilebilir.

Laravel-Excel aslında PhpSpreadsheet paketini bağımlılık olarak kullanıyor. PhpSpreadsheet paketinin mimarisi, hücrelere direkt olarak memory üzerinden erişmek üzerine kurulu olduğu için memory kullanımında darboğaz yapabiliyor. Bunun için çeşitli çözümler üretilse de mimarisinden dolayı performansa iyi yönde etki edecek herhangi bir çözüm yok. Örneğin caching yapmak da yine network trafiği oluşturacağı için performansa kötü anlamda etki ediyor.

--

--