Hướng dẫn laravel excel collection - bộ sưu tập laravel excel

I.Đặt vấn đề

Ngày nay, khi làm một ứng dụng web chắc hẳn nhiều bạn đã từng nghĩ đến việc việc nhập và xuất dữ liệu vào database thông qua các file như excel, csv (nhập danh sách sản phẩm, bài viết, người dùng...) bởi nó giúp chúng ta dễ dàng thêm cũng như lấy dữ liệu từ trang web. Trong bài viết ngày hôm nay mình sẽ giới thiệu đến các bạn package

'aliases' => [
    ...
    'Excel' => Maatwebsite\Excel\Facades\Excel::class,
]
5, thứ có thể đáp ứng được hết những nhu cấu mình nêu ở trên với rất nhiều tính năng đi kèm.

Phiên bản mình dùng sẽ là phiên bản 3.1 và dưới đây mình sẽ hướng dẫn dựa trên các ví dụ nhỏ, giúp các bạn dễ hình dung trong việc tìm hiểu về package. Bắt đầu thôi nào

Hướng dẫn laravel excel collection - bộ sưu tập laravel excel

II.Cài đặt

1.Yêu cầu

  • PHP: ^7.0
  • Laravel: ^5.5
  • PhpSpreadsheet: ^1.6
  • PHP extension: php_zip, php_xml, php_gd2
VersionLaravel VersionPhp VersionSupport
2.1 <=5.6 <=7.0 Unsupported since 15-5-2018
3.0 ^5.5 ^7.0 Unsupported since 31-12-2018
3.1 ^5.5|^6.0 ^7.1 New features

2.Cài đặt package

Đầu tiên, ta ghõ dòng lệnh này vào terminal

composer require maatwebsite/excel

Thêm provider và alias vào trong file

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

'providers' => [
    /*
     * Package Service Providers...
     */
    Maatwebsite\Excel\ExcelServiceProvider::class,
]
'aliases' => [
    ...
    'Excel' => Maatwebsite\Excel\Facades\Excel::class,
]

Việc tiếp theo là publish file config của package bằng câu lệnh

php artisan vendor:publish --provider="Maatwebsite\Excel\ExcelServiceProvider"

Câu lệnh trên sẽ tạo ra file config

'aliases' => [
    ...
    'Excel' => Maatwebsite\Excel\Facades\Excel::class,
]
7 vào trong thư mục config và đó cũng là bước cuối cùng để cài đặt package
'aliases' => [
    ...
    'Excel' => Maatwebsite\Excel\Facades\Excel::class,
]
5 rồi, giờ chúng ta sang phần tiếp theo là tìm hiểu những chức năng hay ho mà package này đem lại cho chúng ta thôi
Hướng dẫn laravel excel collection - bộ sưu tập laravel excel

III.Tìm hiểu về tính năng xuất dữ liệu 'aliases' => [ ... 'Excel' => Maatwebsite\Excel\Facades\Excel::class, ] 9

Đối với công việc

php artisan vendor:publish --provider="Maatwebsite\Excel\ExcelServiceProvider"
0/
'aliases' => [
    ...
    'Excel' => Maatwebsite\Excel\Facades\Excel::class,
]
9 dữ liệu ra file Excel, package
'aliases' => [
    ...
    'Excel' => Maatwebsite\Excel\Facades\Excel::class,
]
5 cung cấp cho chúng ta rất nhiều tính năng như xuất file với nhiều định dạng, export format, mapping data, xuất file qua view blade,... nhưng trong bài viết này mình chỉ liệt kê một số chức năng cơ bản mà mình hay sử dụng và mình nghĩ đủ để đáp ứng nhu cầu của các bạn

1. Xuất một file

Việc đầu tiên là chúng ta sẽ tạo thư mục

php artisan vendor:publish --provider="Maatwebsite\Excel\ExcelServiceProvider"
3

Tiếp theo bạn gõ câu lệnh sau vào terminal:

php artisan make:export UsersExport --model=User

Sau khi chạy câu lệnh trên sẽ tạo ra 1 file trong thư mục

php artisan vendor:publish --provider="Maatwebsite\Excel\ExcelServiceProvider"
4 có tên là
php artisan vendor:publish --provider="Maatwebsite\Excel\ExcelServiceProvider"
5, bạn sửa file đó với nội dung như sau:

Trong file

php artisan vendor:publish --provider="Maatwebsite\Excel\ExcelServiceProvider"
6 ta thêm hàm
php artisan vendor:publish --provider="Maatwebsite\Excel\ExcelServiceProvider"
7

...
use App\Exports\UserExport;
use Maatwebsite\Excel\Facades\Excel;

class UserController extends Controller
{
    public function export() 
    {
        return Excel::download(new UsersExport, 'users.xlsx');
    }
}

Bạn có thể thay phần đuôi file trong

php artisan vendor:publish --provider="Maatwebsite\Excel\ExcelServiceProvider"
8 để lấy về định dạng file mong muốn như
php artisan vendor:publish --provider="Maatwebsite\Excel\ExcelServiceProvider"
9,
php artisan make:export UsersExport --model=User
0,
php artisan make:export UsersExport --model=User
1,
php artisan make:export UsersExport --model=User
2, ...

Trong

php artisan make:export UsersExport --model=User
3:

Route::get('users/export/', 'UsersController@export');

Như vậy, sau khi vào đường dẫn

php artisan make:export UsersExport --model=User
4 thì ta sẽ nhận được một file có tên
php artisan vendor:publish --provider="Maatwebsite\Excel\ExcelServiceProvider"
8 đã tạo ở trên. Trong file nhận được ở trên đã có thông tin của tất cả các trường của tất cả các
php artisan make:export UsersExport --model=User
6 hiện đang có trong database.

STTTên tài khoảnEmailLoại
1 17020907 0
2 17020908 0
3 17020909 0
... ... ... ...

2. Lấy dữ liệu theo điều kiện

Ở phần trên mình đã hướng dẫn export ra một file chứa tất cả user, bây giờ chúng ta sẽ export ra một file chỉ chứa thông tin của một user hoặc một số user

Trong file

php artisan vendor:publish --provider="Maatwebsite\Excel\ExcelServiceProvider"
5, ta thêm hàm
php artisan make:export UsersExport --model=User
8:

class ClassDetailExport implements FromCollection
{
    public function __construct(int $id) {
    	$this->id = $id;
    }

    public function collection()
    {
        return ClassSubject::findOrFail($this->id);
    }
}

Trong

php artisan make:export UsersExport --model=User
9 ta sửa như sau:

class UserController extends Controller {
    public function exportDetailExcel($id) 
    {
        $user = User::findOrFail($id);
        $file = Excel::download(new UserExport($id), $user->name.'.xlsx');
        return $file;
    }
}

Trong

php artisan make:export UsersExport --model=User
3:

'providers' => [
    /*
     * Package Service Providers...
     */
    Maatwebsite\Excel\ExcelServiceProvider::class,
]
0

Như vậy, sau khi vào đường dẫn

php artisan make:export UsersExport --model=User
4 thì ta sẽ nhận được một file có tên
php artisan vendor:publish --provider="Maatwebsite\Excel\ExcelServiceProvider"
8 đã tạo ở trên. Trong file nhận được ở trên đã có thông tin của tất cả các trường của tất cả các
php artisan make:export UsersExport --model=User
6 hiện đang có trong database.

STT

Tên tài khoản

Email

'providers' => [
    /*
     * Package Service Providers...
     */
    Maatwebsite\Excel\ExcelServiceProvider::class,
]
1

Loại

'providers' => [
    /*
     * Package Service Providers...
     */
    Maatwebsite\Excel\ExcelServiceProvider::class,
]
2

...

'providers' => [
    /*
     * Package Service Providers...
     */
    Maatwebsite\Excel\ExcelServiceProvider::class,
]
3

2. Lấy dữ liệu theo điều kiện

Ở phần trên mình đã hướng dẫn export ra một file chứa tất cả user, bây giờ chúng ta sẽ export ra một file chỉ chứa thông tin của một user hoặc một số user

Trong file

php artisan vendor:publish --provider="Maatwebsite\Excel\ExcelServiceProvider"
5, ta thêm hàm
php artisan make:export UsersExport --model=User
8:

'providers' => [
    /*
     * Package Service Providers...
     */
    Maatwebsite\Excel\ExcelServiceProvider::class,
]
4

Trong

php artisan make:export UsersExport --model=User
9 ta sửa như sau:

'providers' => [
    /*
     * Package Service Providers...
     */
    Maatwebsite\Excel\ExcelServiceProvider::class,
]
5

Vậy là bạn có thể xuất ra những file chứa

php artisan make:export UsersExport --model=User
6 theo id cho trước, với các điều kiện khác các bạn làm tương tự các bước trên nhé.

'providers' => [
    /*
     * Package Service Providers...
     */
    Maatwebsite\Excel\ExcelServiceProvider::class,
]
6

3. Xuất file dựa theo

Như mình đã nói, package này cung cấp cho chúng ta rất nhiều tính năng hữu ích trong đó có tính năng xuất file dựa trên view

Trong file

4, bạn implements
5:

Tạo file

6 chứa thông tin của các
php artisan make:export UsersExport --model=User
6, package sẽ tự động chuyển đổi bảng
8 thành bảng
9:

'providers' => [
    /*
     * Package Service Providers...
     */
    Maatwebsite\Excel\ExcelServiceProvider::class,
]
7

Trong file

php artisan make:export UsersExport --model=User
9 bạn sửa lại hàm
php artisan vendor:publish --provider="Maatwebsite\Excel\ExcelServiceProvider"
7

'providers' => [
    /*
     * Package Service Providers...
     */
    Maatwebsite\Excel\ExcelServiceProvider::class,
]
8

4. Tạo các trang tính

...
use App\Exports\UserExport;
use Maatwebsite\Excel\Facades\Excel;

class UserController extends Controller
{
    public function export() 
    {
        return Excel::download(new UsersExport, 'users.xlsx');
    }
}
2

Lưu ý:

  • Nếu trong file Excel cột của bạn có tên là "Tên tài khoản" thì trong file import sẽ là
    Route::get('users/export/', 'UsersController@export');
    
    6
  • Nếu bạn nhập dữ liệu có định dạng là ngày tháng từ trong file Excel mà gặp lỗi thì hãy thử giải quyết bằng cách này, mình đã từng bị và sửa lỗi khá hiệu quả
    Hướng dẫn laravel excel collection - bộ sưu tập laravel excel
'providers' => [
    /*
     * Package Service Providers...
     */
    Maatwebsite\Excel\ExcelServiceProvider::class,
]
9

Trong

php artisan make:export UsersExport --model=User
9:

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

Trong file

Route::get('users/export/', 'UsersController@export');
8:

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

Trong

php artisan make:export UsersExport --model=User
3:

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

2.Batch inserts

Khi bạn nhập một tệp lớn đồng nghĩa với việc một số lượng lớn các hàng sẽ được nhập từ đó dẫn đến hậu quả là bị nghẽn hay gọi là thắt cổ chai và điều đó sẽ làm ảnh hưởng đến công việc nhập dữ liệu. Bằng cách implements WithBatchInserts chúng ta sẽ giải quyết được vấn đề đó bằng cách quyết định số lượng dòng sẽ được nhập vào database mỗi lần.

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

3.Chunk reading

Khác với phần trên, chunk reading sẽ quyết định số lượng dòng sẽ đọc mỗi lần thay vì đọc tất cả rồi lưu tạm vào bộ nhớ, từ đó việc sử dụng bộ nhớ sẽ giảm đi, giúp việc kiểm soát bộ nhớ được tốt hơn.

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

Trên đây là một vài tính năng cơ bản và ữu ích mà package

'aliases' => [
    ...
    'Excel' => Maatwebsite\Excel\Facades\Excel::class,
]
5 đã đem lại, giúp ích khá nhiều trong việc nhập xuất dữ liệu với Excel. Nếu bạn muốn tìm hiểu thêm các tính năng khác thì hãy đọc docs của Maatwebsite link mình để ở dưới.

Hy vọng bài viết này sẽ giúp ích được cho các bạn phần nào khi làm việc với các file như excel, ods, csv... Cảm ơn các bạn đã kiên nhẫn đọc đến cuối bài viết

Hướng dẫn laravel excel collection - bộ sưu tập laravel excel

Tài liệu tham khảo

https://docs.laravel-excel.com/3.1