Tìm hiểu về laravel excel

I. Đặt vấn đề.

Khi bạn làm dự án chắc chắn đã được yêu cầu import dữ liệu file excel hoặc file csv vào database. Khi đó bạn sẽ nghĩ ngay đến các hàm xử lý mà php cung cấp sẵn như fopen để đọc file, fgetcsv để đọc file csv ... Tuy nhiên hôm nay tôi sẽ giới thiệu đến bạn 1 package hỗ trợ chúng ta đọc, xuất file excel hay file csv một cách rất dễ dàng và nhanh chóng. Và đó chính là maatwebsite/excel.

II. Cài đặt

1. Cài đặt package

Copy dòng lệnh dưới đây vào command line để chạy

  composer require maatwebsite/excel

2. Thiết lập cấu hình trong file config/app.php

Đối với Laravel 4.

'providers' => [
	....
	'Maatwebsite\Excel\ExcelServiceProvider',
],
'aliases' => [
	....
	'Excel' => 'Maatwebsite\Excel\Facades\Excel',
],

Đối với Laravel 5

'providers' => [
	....
	Maatwebsite\Excel\ExcelServiceProvider::class,
],
'aliases' => [
	....
	'Excel' => Maatwebsite\Excel\Facades\Excel::class,
],

3. Public file config

Đối với Laravel 4 ta dùng câu lệnh sau

php artisan config:publish maatwebsite/excel

Còn đối với Laravel 5 ta dùng câu lệnh sau

php artisan vendor:publish

Kết quả là sau khi chạy các lệnh bên trên sẽ thêm 1 file config mới tên là excel.php vào thư mục config của bạn. Như vậy là chúng ta đã cấu hình xong hết mọi thứ rồi. Giờ là lúc bắt tay vào khám phám xem Laravel excel package này cung cấp cho chúng ta những tiện ích gì nào 😄

III. Khám phá tính năng import của Laravel excel.

1. Import 1 file.

Để import 1 file trong Laravel excel chúng ta sẽ dùng phương thức ->load($fileName) Example

Excel::load('file.xls', function($reader) {
    // reader methods
});

2. Lấy tất cả các sheet và các row.

Sau khi file đã được load. Chúng ta có thể dùng phương thức ->get() để lấy tất cả các dữ liệu đọc được Example

Excel::load('file.xls', function($reader) {
})->get();

hoặc

Excel::load('file.xls', function($reader) {
    // Getting all results
    $results = $reader->get();
    // ->all() is a wrapper for ->get() and will work the same
    $results = $reader->all();
});

Chú ý: Phương thức ->get()->all() sẽ trả lại 1 sheet hay 1 row collection phụ thuộc vào số lượng sheet của file mà bạn load. Bạn có thể tắt tính năng này bên trong file cấu hình excel.php trong thư mục config của laravel và tình tới thuộc tính force_sheets_collection và thiết lập giá trị là true. Khi thiết lập là true thì sẽ luôn trả về 1 sheet collection.

3. Giới hạn kết quả trả về.

Khi bạn chỉ muốn trả về x dòng đầu tiên của 1 sheet thì bạn có thể dùng phương thức ->take() hoặc limit(). Example

// You can either use ->take()
$reader->take(10);

// Or ->limit()
$reader->limit(10);

Khi bạn muốn bỏ qua 1 số lượng dòng nhất định thì có thể dùng phương thức ->skip(so_dong_muon_bo_qua) hay ->limit(false, so_dong_muon_bo_qua) Example

// Skip 10 results
$reader->skip(10);

// Skip 10 results with limit, but return all other rows
$reader->limit(false, 10);

// Skip and take
$reader->skip(10)->take(10);

// Limit with skip and take
$reader->($skip, $take);

4. Chuyển đổi định dạng kết quả trả về.

Nếu bạn muốn trả về 1 mảng thay vì 1 object thì bạn có thể sử dụng phương thức ->toArray(). Example

$reader->toArray();

Nếu bạn không muốn kết quả trả về là 1 mảng mà là 1 object thì thay vì sử dụng các phương thức ->get() hoặc ->all() thì có thể sử dụng phương thức ->toObject().

$reader->toObject();

5. Hiển thị kết quả.

Nếu muốn kiểm trả kết quả dưới dạng đầu ra có thể đọc được. Bạn có thể dùng phương thức ->dump() hoặc ->dd() Example

// Dump the results
$reader->dump();

// Dump results and die
$reader->dd();

6. Date.

Mặc định kiểu Date sẽ được phân tách dưới định dạng của 1 Carbon object. Bạn có thể tắt tính năng này bằng cách sửa file excel.php trong thư mục config và tìm đến dates.enabled và thiết lập giá trị là false. Để enable/disable đinh dạng date cho 1 import riêng lẻ, chúng ta có thể dùng phương thức ->formatDates($boolean, $format). Example

// Format the dates
$reader->formatDates(true);

// Disable date formatting
$reader->formatDates(false);

// Format dates + set date format
$reader->formatDates(true, 'Y-m-d');

7. Định dạng dates.

Mặc định, dates sẽ không được định dạng nhưng sẽ được trả lại dưới dạng 1 đối tượng Carbon object. Vì vậy nếu muốn định dạng cho dates thì bạn có thể dùng phương thức ->->format($dateFormat). Example

$rows->each(function($row) {
    $created_at = $row->created_at->format('Y-m-d');
});

Nếu muốn thiết lập 1 định dạng date mặc định thì bạn có thể dùng phương thức ->->setDateFormat(). Example

$reader->setDateFormat('Y-m-d');

Nếu muốn thiết lập 1 cột là định dạng date thì bạn có thể sử dụng phương thức ->setDateColumns(). Phương thức này đặc biệt hữu ích nếu bạn sử dụng file csv để import mà muốn thiết lập 1 cột là kiểu date. Example

$reader->setDateColumns(array(
    'created_at',
    'deleted_at'
))

8. Chunk importer

Khi thực hiện import 1 file có dữ liệu lớn thì tính năng này cực kỳ hữu ích. Nó sẽ cho phép bạn đọc mỗi lần n bản ghi cùng 1 lúc. Điều này sẽ giảm được rất nhiều thời gian chúng ta đọc dữ liệu đấy 😄 Example

Excel::filter('chunk')->load('file.csv')->chunk(250, function($results) {
        foreach($results as $row) {
            // do stuff
        }
});

IV. Khám phá tính năng export của Laravel excel.

1. Tạo 1 file mới.

Để tạo 1 file mới chúng ta dùng.

Excel::create('Filename');

2. Export file ra các định dạng mà bạn mong muốn.

Laravel excel hỗ trợ các định dạng của file excel, file csv và file pdf. Để tải 1 file đã đuocẹ tạo, chúng ta có thể dùng phương thức ->export(dinh_dang_file) hoặc ->download(dinh_dang_file).

Export to Excel5 (xls)

Excel::create('Filename', function($excel) {
})->export('xls');

// or
->download('xls');

Export to Excel2007 (xlsx)

->export('xlsx');

// or
->download('xlsx');

Export to CSV

->export('csv');

// or
->download('csv');

Export to PDF Để export file thành dạng pdf thì bạn phải include "dompdf/dompdf": "~0.6.1""mpdf/mpdf": "~5.7.3" hoặc "tecnick.com/tcpdf": "~6.0.0" vào trong file composer.json và thay đổi cấu hình trong file excel.php

->export('pdf');

3. Lưu file trên server.

Để lưu 1 file đã được tạo trên server bạn có thể dùng phương thức ->store($ext, $path = false, $returnInfo = false) hoặc ->save() và mặc định file sẽ được lưu vào thư mục app/storage/exports mà đã được định nghĩa trong file cấu hình export.php

Excel::create('Filename', function($excel) {
    // Set sheets
})->store('xls');

Nếu bạn không muốn lưu vào thư mục mặc định thì bạn có thể chỉ định đường dẫn để lưu file thông qua tham số thứ 2.

 ->store('xls', storage_path('excel/exports'));

Nếu bạn vừa muốn lưu file và export file thì làm như sau.

->store('xls')->export('xls');

4. Tạo 1 sheet từ mảng.

Nếu bạn muốn tạo 1 file mới từ mảng thì dùng phương thức ->->fromArray($source, $nullValue, $startCell, $strictNullComparison, $headingGeneration).

Excel::create('Filename', function($excel) {
    $excel->sheet('Sheetname', function($sheet) {
        $sheet->fromArray([
            ['data1', 'data2'],
            ['data3', 'data4']
        ]);
    });

})->export('xls');

Ngoài ra bạn cũng có thể dùng phương thức ->with() để thay thế.

$sheet->with([
            ['data1', 'data2'],
            ['data3', 'data4']
        ]);

Nếu bạn muốn truyền 1 biến vào trong closure thì dùng use($data).

$datta = [
            ['data1', 'data2'],
            ['data3', 'data4']
 ];
 Excel::create('Filename', function($excel) use($data) {
    $excel->sheet('Sheetname', function($sheet) use($data) {
        $sheet->fromArray($data);
    });
})->export('xls');

Trên đây là 1 vài tính năng rất cơ bản của Laravel excel. Nếu bạn muốn tìm hiểu kỹ hơn thì hãy vào document của laravel excel để đọc kỹ hơn nha. Link package tại đây

Hy vọng bài viết này sẽ cung cấp cho bạn thêm 1 sự lựa chọn khi làm việc với file excel và csv. Cảm ơn các bạn đã theo dõi.

Nguồn tham khảo: Laravel excel package