خروجی Laravel Excel : قالب‌بندی و استایل‌بندی سلول‌ها

گردآوری و تالیف : عرفان کاکایی
تاریخ انتشار : 04 مرداد 1397
دسته بندی ها : لاراول

پکیج Laravel-Excel برای خروجی گرفتن داده‌ها عالی است؛ اما اطلاعات کافی درباره قالب‌بندی سلول‌ها، مانند عرض، word wrapها، (انتقال خودکار کلمه به خط بعدی، وقتی که در آخر خط جا نمی‌شود) فونت و... وجود ندارد. پس وقتی که در یک پروژه به این مسئله بر خوردم، تصمیم گرفتم که این مقاله را بنویسم.

قالب‌بندی و استایل‌بندی سلول‌ها در لاراول

خروجی پیشفرض لاراول

بیایید پروژه ساده‌ای با جدول کاربران و احراز هویت پیشفرض لاراول بسازیم. سپس ۱۰ کاربر تصادفی می‌سازیم. در واقع، لاراول دارای کلاس‌های از پیش تعیین شده برای مدل کاربر است؛ پس تمام کاری که باید انجام دهیم، ساخت فایل UsersTableSeeder.php است:

class UsersTableSeeder extends Seeder
{
    public function run()
    {
        factory(App\User::class, 10)->create();
    }
}

سپس،‌ پکیج Laravel-Excel را وارد می‌کنیم:

composer require maatwebsite/excel

حال، ‌تمام کاربران را در قالب Excel خروجی می‌گیریم. برای انجام این کار، یک کلاس جدا در app/Exports/UsersExport.php می‌سازیم:


namespace App\Exports;

use App\User;
use Maatwebsite\Excel\Concerns\FromCollection;
use Maatwebsite\Excel\Concerns\WithHeadings;

class UsersExport implements FromCollection, WithHeadings
{
    public function collection()
    {
        return User::all();
    }

    public function headings(): array
    {
        return [
            '#',
            'Name',
            'Email',
            'Created at',
            'Updated at'
        ];
    }

}

در آخر، از طریق Controller از آن استفاده می‌کنیم:

namespace App\Http\Controllers;

use App\Exports\UsersExport;
use Maatwebsite\Excel\Facades\Excel;

class ExportController extends Controller
{

    function export()
    {
        return Excel::download(new UsersExport, 'users.xlsx');
    }

}

نتیجه بصری نهایی به این صورت است:

قالب‌بندی و استایل‌بندی سلول‌ها در لاراول

این عمل، کار مورد نظر را انجام داده، و داده‌ها را خروجی می‌گیرد. اما آیا این خروجی، خوب و خوانا به نظر می‌رسد؟ خیر. پس بیایید کمی آن را ویرایش کنیم.

قدم ۱- قالب‌بندی خودکار عرض ستون‌ها

راه بسیار ساده‌ای برای تنظیم خودکار اندازه ستون‌ها وجود دارد. تنها کاری که باید انجام دهید، استفاده از ShouldAutoSize است:

// ...
use Maatwebsite\Excel\Concerns\ShouldAutoSize;

class UsersExport implements FromCollection, WithHeadings, ShouldAutoSize
{
// ...

و نتیجه جدید،‌ به این صورت است:

قالب‌بندی و استایل‌بندی سلول‌ها در لاراول

حال نتیجه بهتری داریم، بیایید ادامه دهیم.

قدم ۲- قالب‌بندی فونت و اندازه‌ها

می‌توانید هر استایل سلولی را با فراخوانی متد registerEvents() و رویداد AfterSheet اعمال کنید:

// ...
use Maatwebsite\Excel\Concerns\WithEvents;
use Maatwebsite\Excel\Events\AfterSheet;

class UsersExport implements FromCollection, WithHeadings, ShouldAutoSize, WithEvents
{

    // ...

    /**
     * @return array
     */
    public function registerEvents(): array
    {
        return [
            AfterSheet::class    => function(AfterSheet $event) {
                $cellRange = 'A1:W1'; // All headers
                $event->sheet->getDelegate()->getStyle($cellRange)->getFont()->setSize(14);
            },
        ];
    }

}

ردیف header به این صورت است:

قالب‌بندی و استایل‌بندی سلول‌ها در لاراول

منطق اصلی در اینجا، این خط است:

$event->sheet->getDelegate()->getStyle($cellRange)->getFont()->setSize(14);

این کد فقط هر محدوده سلولی که به آن انتقال دهیم را می‌گیرد، و استایل‌ها را تغییر می‌دهد. در اینجا باید نگاهی عمیق‌تر به این پکیج داشته باشیم. این پکیج،‌ در واقع بر پایه پکیج PHPSpreadsheet ساخته شده است.

چند مثال از آن پکیج:

جمع‌بندی متن:

$spreadsheet->getActiveSheet()->getStyle('A1:D4')
    ->getAlignment()->setWrapText(true);

استایل پیشفرض یک Worksheet:

$spreadsheet->getDefaultStyle()->getFont()->setName('Arial');
$spreadsheet->getDefaultStyle()->getFont()->setSize(8);

استایل‌بندی borderها و اعمال استایل‌ها از آرایه:

$styleArray = [
    'borders' => [
        'outline' => [
            'borderStyle' => \PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THICK,
            'color' => ['argb' => 'FFFF0000'],
        ],
    ],
];

$worksheet->getStyle('B2:G8')->applyFromArray($styleArray);

و به این صورت می‌توانید خروجی‌های Excel را با استفاده از لاراول و PHP قالب‌بندی کنید. امیدوارم این مقاله برای شما کاربردی بوده باشد

منبع

مقالات پیشنهادی

Laravel-Excel - تبدیل کردن ساده اطلاعات مدل به اکسل

امروز من می خوام به طور خلاصه بررسی اجمالی در مورد پکیج Laravel-Excel داشته باشم . به نظرم احتیاج به این نیست که در مورد این مطلب توضیح خاصی بدم چون ش...

گرفتن خروجی Excel از اطلاعات لاراول

اخیرا من دنبال یک راه ساده برای خروجی Excel گرفتن از اطلاعاتم بصورت یک spreadsheet بودم که بتونه بصورت دوره ای به حسابدار شرکت ارائه بشه. در این آموزش...

Laravel-Excel 3.0 - آرایه‌های سفارشی را در قالب Excel خروجی بگیرید

اخیرا پیکج معروف Laravel-Excel نسخه 3.0 خود را منتشر کرد، که تغییراتی اساسی‌ای نسبت به نسخه قبلی‌اش داشت. من نیاز به یک خروجی اسکل ساده داشتم، و پی بر...

مقدمه‌ای بر تست پروژه لاراولی بوسیله Laravel Dusk

یکی از بزرگترین مشکلاتی که در PHPUnit وجود داشت این بود که تست نرم‌افزارهای برپایه JavaScript غیرممکن بود. با Dusk میتونید براحتی ویژگی‌های Client-sid...