Nhập xuất dữ liệu trong Laravel với package Maatwebsite/Excel

Tram Ho

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 Maatwebsite/Laravel-Excel, 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 😃

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.0Unsupported since 15-5-2018
3.0^5.5^7.0Unsupported since 31-12-2018
3.1^5.5|^6.0^7.1New features

2.Cài đặt package

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

Thêm provider và alias vào trong file config/app.php

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

Câu lệnh trên sẽ tạo ra file config excel.php vào trong thư mục config và đó cũng là bước cuối cùng để cài đặt package Maatwebsite/Laravel-Excel 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 😃

III.Tìm hiểu về tính năng xuất dữ liệu export

Đối với công việc import/export dữ liệu ra file Excel, package Maatwebsite/Laravel-Excel 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 <33

1. Xuất một file

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

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

Sau khi chạy câu lệnh trên sẽ tạo ra 1 file trong thư mục appExport có tên là UserExport.php, bạn sửa file đó với nội dung như sau:

Trong file appHttpControllersUserController.php ta thêm hàm export()

Bạn có thể thay phần đuôi file trong users.xlsx để lấy về định dạng file mong muốn như .xls, .csv, .ods, .html, …

Trong routesweb.php:

Như vậy, sau khi vào đường dẫn user/export thì ta sẽ nhận được một file có tên users.xlsx đã 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 user hiện đang có trong database.

STTTên tài khoảnEmailLoại
117020907[email protected]0
217020908[email protected]0
317020909[email protected]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 UserExport.php, ta thêm hàm __construct():

Trong UserController.php ta sửa như sau:

Trong routesweb.php:

Vậy là bạn có thể xuất ra những file chứa user 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é.

3. Xuất file dựa theo view của laravel

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 .blade.php. Theo cá nhân mình thấy tính năng này giúp cho chúng ta dễ dàng tạo ra những bảng dữ liệu theo ý mình hơn cách ở trên.

Trong file UsersExport.php, bạn implements FromView:

Tạo file users.blade.php chứa thông tin của các user, package sẽ tự động chuyển đổi bảng html thành bảng excel:

Trong file UserController.php bạn sửa lại hàm export()

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

Chắc hẳn các bạn đều biết đến sheet của Excel, nó là các tab giúp chúng ta quản lý và thao tác với dữ liệu một cách dễ dàng hơn. Dưới đây mình sẽ hướng dẫn các bạn chia các sheet thông qua ví dụ lấy các tài khoản theo từng tháng tham gia rồi chia vào các sheet.

Trong file UsersExport.php

Tạo file UsersPerMonthSheet.php, bạn có thể để implements FromQuery, FromCollection, FromView

Thêm hàm export() trong controller UserController.php:

IV. Tìm hiểu về tính năng nhập dữ liệu import

1. Nhập một file

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

Tạo file import bằng cách gõ câu lệnh sau vào terminal:

Trong file UsersImport.php:

Ở trên, hàm headingRow() có mục đích là sẽ loại bỏ những dòng tiêu đề của bảng, hàm sẽ trả về số hàng mà bạn bỏ qua, như ví dụ ở trên thì mình sẽ bỏ qua hàng chứa thông tin của cột như tên tài khoản, email, mật khẩu… Package cho phép chúng ta sử dụng các từ khóa ở phần tiêu đề để làm khóa mảng của mỗi hàng. Ví dụ trên mình nhập dữ liệu cho thuộc tính username dựa trên cột username hoặc tên tài khoản.

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à $row['ten_tai_khoan']
  • 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ả 😄

Trong UserController.php:

Trong file user.blade.php:

Trong routesweb.php:

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.

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.

Trên đây là một vài tính năng cơ bản và ữu ích mà package Maatwebsite/Laravel-Excel đã đ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 😃

Tài liệu tham khảo

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

Chia sẻ bài viết ngay

Nguồn bài viết : Viblo