پکیج 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 قالببندی کنید. امیدوارم این مقاله برای شما کاربردی بوده باشد
دیدگاه و پرسش
در حال دریافت نظرات از سرور، لطفا منتظر بمانید
در حال دریافت نظرات از سرور، لطفا منتظر بمانید