Laravel Excel: Phù Thủy Dữ Liệu Bảng Tính Của Bạn
Lavarel

Laravel Excel: Phù Thủy Dữ Liệu Bảng Tính Của Bạn

Author

Admin System

@root

Ngày xuất bản

20 Mar, 2026

Lượt xem

2 Lượt

Laravel_Excel

À 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?

Illustration

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:

Gợi Ý Đọc Tiếp
Hướng dẫn Seeder_Database - Lavarel

4 Lượt xem

<?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!

  1. 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.
      // 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
      { /* ... */ }
      
      Nhớ cấu hình Queue trong Laravel nhé!
  2. 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 WithValidation rất tuyệt vời, như đã thấy ở ví dụ trên. Đừng bỏ qua nó!

  3. Đị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ý trong model() method (cho import) để đảm bảo dữ liệu đúng chuẩn.

  4. Tên cột (Headers): Luôn dùng WithHeadingRow khi import và WithHeadings khi 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é!

#tech #cyberpunk #laravel
Chỉnh sửa bài viết

Bình luận (0)

Vui lòng Đăng Nhập để Bình luận

Hỗ trợ Markdown cơ bản
Nguyễn Văn A
1 ngày trước

Tính năng này đỉnh quá ad ơi, chờ mãi mới thấy một blog Tiếng Việt có UI/UX xịn như vầy!