Fast Excel 5: ایمپورت فایلهای غولپیکر تو لاراول
خلاصهٔ کاملتر
Fast Excel یه پکیج لاراوله برای خوندن و نوشتن فایلهای اکسل و CSV که بهجای پیادهسازی کل فرمت اکسل، روی OpenSpout سواره و فقط سراغ سطرها میره. برای همین حافظه کمی مصرف میکنه. تو مقاله لاراولنیوز اومده که از آخرینباری که سال ۲۰۲۰ معرفیش کرده بودن پکیج خیلی عوض شده و حالا بیشتر به درد ایمپورتهای سنگین و عملیاتی میخوره، نه فقط دانلود یه گزارش ساده.
قبلاً متد import() همه ردیفها رو یهجا تو یه Collection برمیگردوند و همین برای یه فایل بزرگ، رم پروسه PHP رو تموم میکرد. از نسخه ۵.۱۲ متد importLazy() اضافه شده که ردیفها رو از توی یه LazyCollection میده بیرون، یعنی مجموعهای که ردیفها رو تکتک و در لحظه میخونه بهجای اینکه همهشون رو تو حافظه نگه داره. پس میتونی هزارتا هزارتا بریزی تو دیتابیس:
(new FastExcel)->importLazy('contacts.xlsx')
->chunk(1_000)
->each(function (LazyCollection $contacts) {
Contact::insert($contacts->all());
});برای وقتی که هر جاب صف باید فقط یه تیکه از فایل رو بخونه، سه تا کنترل جدید هست. headerRow() میگه کلیدها از کدوم ردیف بیان، startRow() مشخص میکنه این تیکه از کجا شروع شه و limitRows() اندازهشو محدود میکنه:
$rows = (new FastExcel)
->headerRow(1)
->startRow(2 + ($page * 1_000))
->limitRows(1_000)
->import('orders.xlsx');اینکه headerRow() جدا شده مهمه. قبل از نسخه ۵.۱۷، خود startRow() همون ردیف شروع رو عنوان ستونها هم حساب میکرد، پس تو تیکههای بعدی یه ردیف داده معمولی میشد کلید آرایه. حالا این دو تا از هم جدان و رفتار قدیمی startRow() هم دستنخورده مونده مگه اینکه خودت بخوای. تو نسخه ۵.۱۶ هم sheet() اومد که شیت رو با اسم انتخاب میکنه و onlyColumns() که فقط ستونهای لازم رو نگه میداره (با حرف ستون یا شماره) و جلوی برگشتن فیلدهای خالی رو میگیره.
نکته امنیتی هم escapeFormulas() ـه که تو نسخه ۵.۱۷ اومد: نرمافزارهای صفحهگسترده مقدارهایی که با = یا + یا - یا @ شروع میشن رو فرمول حساب میکنن، پس اگه اون مقدار از ورودی کاربر اومده باشه، یه اکسپورت ساده موقع باز شدن تبدیل به فرمول میشه. این متد اونا رو بهعنوان متن مینویسه. Fast Excel 5 هم به PHP 8 به بالا و لاراول ۶ تا ۱۳ نیاز داره و روی OpenSpout 4 کار میکنه.
نکات کلیدی:
- importLazy() از نسخه ۵.۱۲ ردیفها رو با LazyCollection میخونه تا فایل بزرگ رم رو پر نکنه
- headerRow() تو ۵.۱۷ اضافه شد و مشکل کلید شدن ردیف داده تو ایمپورت تیکهتیکه رو حل کرد
- sheet()، onlyColumns() و limitColumns() تو ۵.۱۶ اومدن
- escapeFormulas() مقدارهای شبیه فرمول رو متن مینویسه
- نیازمندیها: PHP 8 به بالا، لاراول ۶ تا ۱۳، OpenSpout 4




