
À này các bạn sinh viên tương lai của tôi, hôm nay Giảng viên Creyt sẽ kéo các bạn ra khỏi thế giới của những vòng lặp vô tận để cùng khám phá một công cụ mà tôi dám cá là sẽ cứu rỗi rất nhiều dự án của các bạn khỏi cái gọi là 'nhập liệu thủ công' hay 'báo cáo thủ công'. Đó chính là Laravel Excel.
Laravel Excel Là Gì? Để Làm Gì?
Hãy hình dung thế này: ứng dụng Laravel của bạn là một nhà máy sản xuất dữ liệu tinh vi, còn người dùng của bạn thì cứ nằng nặc đòi đầu ra phải đóng gói vào những chiếc hộp Excel quen thuộc, hoặc họ lại muốn nhét cả tấn nguyên liệu thô từ file Excel vào nhà máy của bạn. Nếu bạn tự tay làm từng chiếc hộp hay bốc từng bao nguyên liệu, thì thôi rồi, bạn sẽ hóa đá mất. Đó là lúc Laravel Excel xuất hiện, như một 'thư ký đa năng' với năng lực siêu phàm.
Nói một cách hàn lâm hơn, Laravel Excel là một package mạnh mẽ (được phát triển bởi Maatwebsite) cung cấp một API cực kỳ 'nuột' để bạn có thể dễ dàng xuất (export) dữ liệu từ database của mình ra các định dạng bảng tính như Excel (.xlsx, .xls) hay CSV, và ngược lại, nhập (import) dữ liệu từ các file bảng tính đó vào database một cách thần tốc. Nó giải quyết triệt để nỗi đau khi phải 'múa lửa' với PHPSpreadsheet một cách thủ công.
Tại Sao Phải Dùng Laravel Excel?
- Tiết kiệm thời gian & công sức: Thay vì viết hàng trăm dòng code để xử lý file Excel, bạn chỉ cần vài dòng với Laravel Excel.
- Dễ sử dụng: API trực quan, dễ học, dễ nhớ, đúng kiểu Laravel.
- Hiệu suất cao: Hỗ trợ xử lý file lớn, tích hợp hàng đợi (queues) để không làm tắc nghẽn server.
- Linh hoạt: Tùy chỉnh đầu ra/đầu vào, định dạng dữ liệu theo ý muốn.
Bắt Đầu Với Laravel Excel
Đầu tiên, chúng ta cần mời vị thư ký này về làm việc. Mở terminal lên và gõ:
composer require maatwebsite/excel
Nếu bạn đang dùng Laravel phiên bản cũ (dưới 5.5), bạn sẽ cần đăng ký ServiceProvider và alias thủ công. Nhưng với Laravel 5.5 trở lên, nó sẽ tự động nhận diện (auto-discovery) hết. Quá tiện phải không?

Xuất Dữ Liệu (Exporting Data): Từ Database Ra Excel
Giả sử bạn có một bảng users và muốn xuất toàn bộ danh sách người dùng ra file Excel. Dễ như ăn kẹo!
Bước 1: Tạo một Export Class
php artisan make:export UsersExport --model=User
Lệnh này sẽ tạo ra một file app/Exports/UsersExport.php:
<?php
namespace App\Exports;
use App\Models\User;
use Maatwebsite\Excel\Concerns\FromCollection;
use Maatwebsite\Excel\Concerns\WithHeadings;
class UsersExport implements FromCollection, WithHeadings
{
/**
* @return \Illuminate\Support\Collection
*/
public function collection()
{
return User::all(); // Lấy tất cả người dùng
}
/**
* @return array
*/
public function headings(): array
{
return [
'ID',
'Tên',
'Email',
'Email đã xác thực vào lúc',
'Mật khẩu',
'Token nhớ',
'Ngày tạo',
'Ngày cập nhật',
];
}
}
Ở đây, FromCollection nghĩa là bạn sẽ cung cấp một Collection dữ liệu. WithHeadings giúp bạn định nghĩa các tiêu đề cột (header) trong file Excel. Nếu không có WithHeadings, nó sẽ dùng tên cột trong database.
Bước 2: Kích hoạt Export trong Controller
<?php
namespace App\Http\Controllers;
use App\Exports\UsersExport;
use Maatwebsite\Excel\Facades\Excel;
use Illuminate\Http\Request;
class UserController extends Controller
{
public function export()
{
// Tên file sẽ là users.xlsx
return Excel::download(new UsersExport, 'users.xlsx');
}
}
Bước 3: Định nghĩa Route
// routes/web.php
Route::get('users/export', [App\Http\Controllers\UserController::class, 'export'])->name('users.export');
Bây giờ, khi truy cập your-app.com/users/export, trình duyệt sẽ tự động tải về file users.xlsx chứa danh sách người dùng.
Nhập Dữ Liệu (Importing Data): Từ Excel Vào Database
Giả sử bạn muốn cho phép người dùng tải lên một file Excel chứa danh sách người dùng mới để thêm vào hệ thống.
Bước 1: Tạo một Import Class
php artisan make:import UsersImport --model=User
Lệnh này sẽ tạo ra một file app/Imports/UsersImport.php:
<?php
namespace App\Imports;
use App\Models\User;
use Maatwebsite\Excel\Concerns\ToModel;
use Maatwebsite\Excel\Concerns\WithHeadingRow;
use Maatwebsite\Excel\Concerns\WithValidation;
class UsersImport implements ToModel, WithHeadingRow, WithValidation
{
/**
* @param array $row
*
* @return \Illuminate\Database\Eloquent\Model|null
*/
public function model(array $row)
{
// Ở đây, $row là một mảng dữ liệu của một hàng trong Excel.
// WithHeadingRow giúp chúng ta truy cập dữ liệu bằng tên tiêu đề cột thay vì chỉ số.
return new User([
'name' => $row['ten'], // 'ten' là tên cột trong file Excel
'email' => $row['email'],
'password' => bcrypt($row['mat_khau'] ?? 'password'), // Tạo mật khẩu mặc định nếu không có
]);
}
/**
* Định nghĩa các quy tắc kiểm tra dữ liệu cho từng hàng.
* @return array
*/
public function rules(): array
{
return [
'ten' => 'required|string|max:255',
'email' => 'required|string|email|max:255|unique:users,email',
'mat_khau' => 'nullable|string|min:8',
];
}
/**
* Tùy chỉnh thông báo lỗi (optional)
* @return array
*/
public function customValidationMessages()
{
return [
'email.unique' => 'Email :input đã tồn tại trong hệ thống.',
'ten.required' => 'Trường tên không được để trống.',
];
}
}
ToModel cho phép bạn map dữ liệu từ mỗi hàng Excel trực tiếp vào một Eloquent Model. WithHeadingRow là một 'cứu tinh' khi nó biến hàng đầu tiên thành các khóa (key) cho mảng $row, giúp code dễ đọc và bảo trì hơn rất nhiều. WithValidation cho phép bạn định nghĩa các quy tắc kiểm tra dữ liệu.
Bước 2: Xử lý Upload trong Controller
Bạn sẽ cần một form để người dùng tải file lên:
<!-- resources/views/users/import.blade.php -->
<form action="{{ route('users.import.store') }}" method="POST" enctype="multipart/form-data">
@csrf
<input type="file" name="file">
<button type="submit">Import Users</button>
</form>
Và trong Controller:
<?php
namespace App\Http\Controllers;
use App\Imports\UsersImport;
use Maatwebsite\Excel\Facades\Excel;
use Illuminate\Http\Request;
class UserController extends Controller
{
public function showImportForm()
{
return view('users.import');
}
public function import(Request $request)
{
$request->validate([
'file' => 'required|mimes:xlsx,xls,csv'
]);
try {
Excel::import(new UsersImport, $request->file('file'));
} catch (\Maatwebsite\Excel\Validators\ValidationException $e) {
$failures = $e->failures();
// Xử lý các lỗi validation
// Ví dụ: redirect back with errors
return redirect()->back()->withErrors($failures)->with('error', 'Có lỗi khi nhập dữ liệu!');
}
return redirect()->back()->with('success', 'Nhập dữ liệu người dùng thành công!');
}
}
Bước 3: Định nghĩa Route
// routes/web.php
Route::get('users/import', [App\Http\Controllers\UserController::class, 'showImportForm'])->name('users.import');
Route::post('users/import', [App\Http\Controllers\UserController::class, 'import'])->name('users.import.store');
Mẹo Của Giảng Viên Creyt: Đừng Quên Bài Học Xương Máu Này!
-
Xử lý file lớn (Chunking & Queues):
- Import: Khi bạn có hàng chục nghìn, thậm chí hàng triệu dòng dữ liệu, việc đọc tất cả vào bộ nhớ cùng lúc là hành động tự sát. Hãy dùng
WithChunkReadingđể Laravel Excel đọc file theo từng 'miếng' nhỏ (chunk).// Trong UsersImport.php use Maatwebsite\Excel\Concerns\WithChunkReading; class UsersImport implements ToModel, WithChunkReading { public function chunkSize(): int { return 1000; // Đọc 1000 dòng một lần } // ... các method khác ... } - Export & Import (Queueing): Đối với các tác vụ xuất/nhập tốn thời gian, đừng bắt người dùng phải đợi. Hãy đẩy chúng vào hàng đợi (queue) để xử lý ở chế độ nền. Điều này giúp ứng dụng của bạn luôn phản hồi nhanh chóng.
Nhớ cấu hình Queue trong Laravel nhé!// Trong UsersExport.php hoặc UsersImport.php use Maatwebsite\Excel\Concerns\ShouldQueue; class UsersExport implements FromCollection, WithHeadings, ShouldQueue { /* ... */ } // Hoặc class UsersImport implements ToModel, WithHeadingRow, ShouldQueue { /* ... */ }
- Import: Khi bạn có hàng chục nghìn, thậm chí hàng triệu dòng dữ liệu, việc đọc tất cả vào bộ nhớ cùng lúc là hành động tự sát. Hãy dùng
-
Validation nghiêm ngặt: Dữ liệu từ bên ngoài luôn tiềm ẩn rủi ro. Luôn luôn kiểm tra (validate) dữ liệu đầu vào. Laravel Excel tích hợp
WithValidationrất tuyệt vời, như đã thấy ở ví dụ trên. Đừng bỏ qua nó! -
Định dạng dữ liệu: Đặc biệt là ngày tháng, số. Excel có thể 'thông minh' quá mức và làm sai lệch định dạng. Hãy dùng
WithColumnFormatting(cho export) hoặc xử lý trongmodel()method (cho import) để đảm bảo dữ liệu đúng chuẩn. -
Tên cột (Headers): Luôn dùng
WithHeadingRowkhi import vàWithHeadingskhi export. Nó giúp code của bạn dễ đọc, dễ bảo trì hơn rất nhiều so với việc dùng chỉ số cột (0, 1, 2...). Imagine bạn phải nhớ cột 5 là email, cột 7 là địa chỉ... Thật kinh khủng!
Ứng Dụng Thực Tế
Laravel Excel được ứng dụng rộng rãi trong rất nhiều hệ thống mà bạn có thể đang dùng hàng ngày:
- Hệ thống E-commerce: Xuất danh sách đơn hàng, báo cáo doanh thu, danh sách sản phẩm; nhập cập nhật giá sản phẩm hàng loạt.
- Hệ thống CRM: Xuất danh sách khách hàng tiềm năng, báo cáo tương tác; nhập danh sách khách hàng mới từ file của đội sale.
- Hệ thống Kế toán/Tài chính: Xuất báo cáo giao dịch, sổ cái; nhập dữ liệu ngân sách, chi phí.
- Hệ thống Giáo dục: Xuất bảng điểm, danh sách sinh viên; nhập thông tin khóa học, điểm thi.
Lời Kết
Laravel Excel không chỉ là một công cụ, nó là một 'người bạn' đắc lực giúp bạn giải quyết những bài toán hóc búa liên quan đến dữ liệu bảng tính một cách thanh lịch và hiệu quả. Hãy làm chủ nó, và bạn sẽ thấy công việc của mình nhẹ nhàng hơn rất nhiều. Nhớ nhé, đừng bao giờ để dữ liệu bảng tính làm khó các lập trình viên tài năng như các bạn! Hẹn gặp lại trong bài học tiếp theo!
Thuộc Series: Lavarel
Bài giảng này được tự động xuất bản ngẫu nhiên từ thư viện kiến thức. Đừng quên đón xem các Từ khoá Hướng Dẫn tiếp theo nhé!