Tìm hiểu về laravel excel
Bài đăng này đã không được cập nhật trong 7 năm
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()
và ->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"
và "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
All rights reserved