Import, export file excel trong Laravel với Maatwebsite

Tram Ho

Lời nói đầu

  • Bài viết này xuất phát từ một bài toán cũng khá hay gặp trong thực tế, đó là khi quản lí của bạn hoặc các bộ phận non-tech trong công ty muốn xem danh sách thống kê của hệ thống (danh sách người dùng/sản phẩm/…). Có 2 phương án có thể được sử dụng:
    • Cách 1: Bạn tạo tài khoản có quyền admin trên server product cho họ tự vào trang admin xem.
    • Cách 2: Bạn sẽ lấy từ CSDL, xuất ra file Excel để tiện cho việc tính toán, thống kê sau này.
  • Nếu bạn chọn cách 1, bài toán được giải quyết trong 1 nốt nhạc và bạn cũng sẽ không cần phải đọc tiếp nữa đâu, còn nếu bạn chọn cách 2, bài viết này chính là thứ bạn cần. Và công cụ chúng ta sẽ sử dụng là package maatwebsite/excel.
  • Và đây là một số ưu điểm mà Laravel Excel đưa ra:
    • Dễ dàng export/import collections ra file Excel.
    • Tự động chunking (chia nhỏ) collections để tổi ưu performance.
    • Đọc file Excel theo từng nhóm/khối (chunks).
    • Xử lí import theo từng batch.

Nội dung

Cài đặt

  • Trước khi tiến hành cài đặt thì chúng ta cùng xem qua một số requirement để lựa chọn phiên bản phù hợp nhé. Còn nếu bạn làm với mục đích tìm tòi học hỏi thì mình nghĩ cứ phiên bản mới nhất (tại thời điểm viết bài là phiên bản 3.1) mà chiến thôi

    VersionRequire LaravelRequire PHPSupport Time
    2.1<= 5.6<= 7.0Unsupported since 15-5-2018
    3.0^5.5^7.0Unsupported since 31-12-2018
    3.1^5.5/^6.0^7.1New features
  • Ngoài yêu cầu về phiên bản của PHP và Laravel thì còn một số yêu cầu khác như:

    • PhpSpreadsheet: ^1.6 (đối với version 3.1)
    • PHP extension php_zip is enabled.
    • PHP extension php_xml is enabled.
    • PHP extension php_gd2 is enabled.
  • Khi đã đảm bảo rằng môi trường bạn cài đặt đã đáp ứng đủ các yêu cầu thì bạn có thể cài đặt thông qua composer với câu lệnh:

  • Sau đó bạn kiểm tra trong file config/app.php phần providers và alias xem đã có Maatwebsite chưa, bình thường thì nó sẽ được tự động add vào sau khi chạy câu lệnh cài đặt:

  • Cuối cùng để publish config, chúng ta chạy câu lệnh bên dưới thì sẽ tạo ra một file config config/excel.php chứa các thiết lập cần thiết.

Export

  • Để có thể thực hiện chức năng export ra file Excel, việc đầu tiên ta cần làm là tạo 1 class export trong thư mục appExports.

    • Cách 1: sử dụng câu lệnh
    • Cách 2: tạo thủ công bằng tay theo đường dẫn appExports:
  • Tiếp theo là thêm function export vào trong controller để thực hiện export file:

  • Và 1 route để gọi controller đó

  • Bên trên là các bước đơn giản để có thể export file, ngoài ra, có thể bạn sẽ cần custom 1 số thứ ví dụ như:

    • Định dạng file export: mặc định thì phần đuôi file .xlsx sẽ xác định định dạng của file. Tuy nhiên bạn cũng có thể truyền thêm tham số để có thể khai báo 1 cách rõ ràng hơn ntn

    • Định dạng cột dữ liệu:

      • Nếu bạn muốn tự động điều chỉnh độ rộng cột, bạn chỉ cần implement thêm ShouldAutoSize.
      • Để định dạng dữ liệu đặc biệt (ngày tháng/tiền) thì bạn sẽ cần implement WithColumnFormatting.
    • Viết test cho chức năng export: nếu các bạn đã từng chật vật với automation test (unit/feature) thì anh em chắc chắn sẽ thích điều này vì trong document của Laravel Excel đã hướng dẫn viết test cho bạn rồi. Tất nhiên là bạn phải tự custom cho phù hợp với project của bạn nhé

Import

  • Import về cơ bản cũng tương tự với export, bao gồm tạo một import class trong thư mục appImportsXxxxImport.php và thêm function import vào trong controller như sau:

  • Tất nhiên thực tế sẽ không đơn giản như vậy mà bạn sẽ cần phải tuỳ chỉnh thêm một số chứ năng nữa:

    • Validate dữ liệu: có người từng nói với mình rằng, đừng baoh tin vào “người dùng”. Đó là lí do vì sao bạn phải validate tất cả những gì mà người dùng nhập/submit vào hệ thống của bạn. Và khi import dữ liệu, thì bạn cũng sẽ phải validate dữ liệu trong sheet có hợp lệ hay không.

      Và để có thể validate dữ liệu các cột import dữ liệu, bạn sẽ cần thêm method rule() vào trong import class. Để tham khảo thêm nhiều rule khác, bạn có thể xem ở đây.

      Ngoài ra, bạn cũng sẽ cần hiển thị thông báo validate message cho người dùng biết để thay đổi dữ liệu cho phù hợp với customValidationMessages()

    • Progress Bar (trong command console): đây cũng là 1 chức năng khá hay, đối với việc import lượng dữ liệu lớn, bạn sẽ cần phải theo dõi xem quá trình import đã thực hiện được đến đâu thay vì phải ngồi chờ trong vô vọng mà ko biết phải chờ đến bao giờ ?. Đầu tiên, bạn cần phải implement WithProgressBar vào trong import class ở đường dẫn appImportsXxxImport, sau đó tạo một command để chạy chức năng import, ví dụ như sau:

      Và khi bạn gõ lệnh php artisan import:excel để thực hiện quá trình import, bạn sẽ thấy tiêu đề Starting import, thanh progress bar và thông báo thành công sau khi import (nếu ko có lỗi) Import successful.

    • Viết test: tương tự như phần export thì Laravel Excel cũng đã cung cấp test mẫu cho phần Import, bạn có thể tham khảo ở trong link document nhé, mình sẽ không liệt kê lại trong đây nữa.

Lời kết

Bản thân mình thấy đây là một chức năng khá cần thiết khi bạn cần import/export dữ liệu, data một cách nhanh chóng. Nếu bài viết có ích, hãy upvote ủng hộ mình nhé. Còn nếu bạn thấy còn điều gì “lấn cấn”, hãy comment xuống phía dưới để chúng ta cùng thảo luận nhé!

Cảm ơn các bạn đã dành thời gian ủng hộ bài viết của mình!

Tài liệu tham khảo

Chia sẻ bài viết ngay

Nguồn bài viết : Viblo