Import & Export file excel, xlsx, tsv, ods, xls…dễ dàng với thư viện Maatwebsite

export và import excel file một cách dễ dàng.

Laravel Excel được thiết kế như một phiên bản Laravel của PhpSpreadsheet. Đây là một class kế thừa và bổ sung cho PhpSpreadsheet để đơn giản hóa việc Export và Import dữ liệu từ các bảng tính. PhpSpreadsheet là một thư viện dựa trên PHP cho phép bạn đọc và ghi các định dạng tệp bảng tính khác nhau như Excel và LibreOffice Calc. Laravel Excel có những tính năng sau:

  • Dễ dàng xuất các bộ sưu tập thành tệp Excel.
  • Xuất các truy vấn với chia nhỏ tự động để tăng hiệu suất.
  • Xếp hàng đợi để tăng hiệu suất.
  • Dễ dàng xuất các giao diện Blade thành tệp Excel.
  • Dễ dàng nhập dữ liệu vào các bộ sưu tập.
  • Đọc tệp Excel theo từng phần.
  • Xử lý việc chèn dữ liệu nhập khẩu theo lô.

Nếu bạn muốn tạo chức năng Export và Import tệp Excel dễ dàng, hướng dẫn này là ý hay cho bạn.

Yêu cầu

  • PHP: ^7.2|^8.0
  • Laravel: ^5.8
  • PhpSpreadsheet: ^1.15
  • PHP extension php_zip enabled
  • PHP extension php_xml enabled
  • PHP extension php_gd2 enabled
  • PHP extension php_iconv enabled
  • PHP extension php_simplexml enabled
  • PHP extension php_xmlreader enabled
  • PHP extension php_zlib enabled

Bước 1: Cài đặt Dự án Laravel

Mở Terminal và chạy lệnh sau để tạo một dự án Laravel mới:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
composer create-project --prefer-dist laravel/laravel laravel-excel
composer create-project --prefer-dist laravel/laravel laravel-excel
composer create-project --prefer-dist laravel/laravel laravel-excel

Hoặc, nếu bạn đã cài đặt Laravel Installer global composer:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
laravel new laravel-excel
laravel new laravel-excel
laravel new laravel-excel

Bước 2: Cấu hình Chi tiết Cơ sở dữ liệu

Sau khi cài đặt xong, điều hướng đến thư mục gốc của dự án, mở tệp .env và đặt chi tiết cơ sở dữ liệu như sau:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=<TÊN CƠ SỞ DỮ LIỆU>
DB_USERNAME=<TÊN NGƯỜI DÙNG CƠ SỞ DỮ LIỆU>
DB_PASSWORD=<MẬT KHẨU CƠ SỞ DỮ LIỆU>
DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=<TÊN CƠ SỞ DỮ LIỆU> DB_USERNAME=<TÊN NGƯỜI DÙNG CƠ SỞ DỮ LIỆU> DB_PASSWORD=<MẬT KHẨU CƠ SỞ DỮ LIỆU>
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=<TÊN CƠ SỞ DỮ LIỆU>
DB_USERNAME=<TÊN NGƯỜI DÙNG CƠ SỞ DỮ LIỆU>
DB_PASSWORD=<MẬT KHẨU CƠ SỞ DỮ LIỆU>

Bước 3: Cài đặt gói maatwebsite/excel

Cài đặt Laravel Excel qua composer bằng lệnh sau:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
composer require maatwebsite/excel
composer require maatwebsite/excel
composer require maatwebsite/excel
Tiếp theo, đăng ký providersaliases. Mở tệp config/app.php và thêm đoạn mã sau:
Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
'providers' => [
Maatwebsite\Excel\ExcelServiceProvider::class,
],
'aliases' => [
'Excel' => Maatwebsite\Excel\Facades\Excel::class,
],
'providers' => [ Maatwebsite\Excel\ExcelServiceProvider::class, ], 'aliases' => [ 'Excel' => Maatwebsite\Excel\Facades\Excel::class, ],
'providers' => [
     Maatwebsite\Excel\ExcelServiceProvider::class,
],
'aliases' => [
     'Excel' => Maatwebsite\Excel\Facades\Excel::class,
],

 

Sau đó, thực thi lệnh để export cấu hình:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
php artisan vendor:publish --provider="Maatwebsite\Excel\ExcelServiceProvider" --tag=config
php artisan vendor:publish --provider="Maatwebsite\Excel\ExcelServiceProvider" --tag=config
php artisan vendor:publish --provider="Maatwebsite\Excel\ExcelServiceProvider" --tag=config
Lệnh này sẽ tạo một tệp cấu hình mới tại config/excel.php.

Bước 4: Tạo dữ liệu giả và di chuyển bảng

Trong Bước 1, chúng ta sẽ di chuyển bảng users. Sau khi migration thành công, chúng ta sẽ tiếp tục Bước 2.

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
php artisan migrate
php artisan migrate
php artisan migrate

Trong Bước 2, chúng ta sẽ tạo dữ liệu giả. Sử dụng tinker để tạo dữ liệu giả trong cơ sở dữ liệu:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
php artisan tinker
php artisan tinker
php artisan tinker

Trong tinker, chạy lệnh sau để tạo 100 bản ghi giả:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
User::factory()->count(100)->create();
User::factory()->count(100)->create();
User::factory()->count(100)->create();

Bước 5: Tạo Route

Trong bước này, chúng ta sẽ thêm các route để xử lý yêu cầu export và import file

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
use App\Http\Controllers\UserController;
Route::get('/file-import',[UserController::class,'importView'])->name('import-view');
Route::post('/import',[UserController::class,'import'])->name('import');
Route::get('/export-users',[UserController::class,'exportUsers'])->name('export-users');
use App\Http\Controllers\UserController; Route::get('/file-import',[UserController::class,'importView'])->name('import-view'); Route::post('/import',[UserController::class,'import'])->name('import'); Route::get('/export-users',[UserController::class,'exportUsers'])->name('export-users');
use App\Http\Controllers\UserController;

Route::get('/file-import',[UserController::class,'importView'])->name('import-view');
Route::post('/import',[UserController::class,'import'])->name('import');
Route::get('/export-users',[UserController::class,'exportUsers'])->name('export-users');

Bước 6: Tạo Lớp Import

Maatwebsite cung cấp một lệnh để tạo class Import và chúng ta sẽ sử dụng nó trong controller. Chạy lệnh sau để tạo class import và sửa code trong tệp tạo ra:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
php artisan make:import ImportUser --model=User
php artisan make:import ImportUser --model=User
php artisan make:import ImportUser --model=User

app/Imports/ImportUser.php

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
<?php
namespace App\Imports;
use App\Models\User;
use Maatwebsite\Excel\Concerns\ToModel;
class ImportUser implements ToModel
{
/**
* @param array $row
*
* @return \Illuminate\Database\Eloquent\Model|null
*/
public function model(array $row)
{
return new User([
'name' => $row[0],
'email' => $row[1],
'password' => bcrypt($row[2]),
]);
}
}
<?php namespace App\Imports; use App\Models\User; use Maatwebsite\Excel\Concerns\ToModel; class ImportUser implements ToModel { /** * @param array $row * * @return \Illuminate\Database\Eloquent\Model|null */ public function model(array $row) { return new User([ 'name' => $row[0], 'email' => $row[1], 'password' => bcrypt($row[2]), ]); } }
<?php

namespace App\Imports;

use App\Models\User;
use Maatwebsite\Excel\Concerns\ToModel;

class ImportUser implements ToModel
{
   /**
   * @param array $row
   *
   * @return \Illuminate\Database\Eloquent\Model|null
   */
   public function model(array $row)
   {
      return new User([
         'name' => $row[0],
         'email' => $row[1],
         'password' => bcrypt($row[2]),
      ]);
   }
}

Ở đây, bạn có thể thấy cách ánh xạ giá trị cột CSV hoặc Excel vào Model Eloquent. Hãy định dạng cột CSV hoặc Excel theo cách bạn ánh xạ trong lớp nhập khẩu.

Bước 7: Tạo Lớp Export

Maatwebsite cung cấp một lênh Artisan để tạo class export và chúng ta sẽ sử dụng nó trong controller. Chạy lệnh sau để tạo class export và sửa code trong tệp tạo ra:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
php artisan make:export ExportUser --model=User
php artisan make:export ExportUser --model=User
php artisan make:export ExportUser --model=User

app/Exports/ExportUser.php

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
<?php
namespace App\Exports;
use App\Models\User;
use Maatwebsite\Excel\Concerns\FromCollection;
class ExportUser implements FromCollection
{
/**
* @return \Illuminate\Support\Collection
*/
public function collection()
{
return User::select('name', 'email')->get();
}
}
<?php namespace App\Exports; use App\Models\User; use Maatwebsite\Excel\Concerns\FromCollection; class ExportUser implements FromCollection { /** * @return \Illuminate\Support\Collection */ public function collection() { return User::select('name', 'email')->get(); } }
<?php

namespace App\Exports;

use App\Models\User;
use Maatwebsite\Excel\Concerns\FromCollection;

class ExportUser implements FromCollection
{
    /**
     * @return \Illuminate\Support\Collection
     */
    public function collection()
    {
        return User::select('name', 'email')->get();
    }
}

Bước 8: Tạo Controller

Tiếp theo, chúng ta cần tạo một controller để hiển thị form tải lên tệp CSV hoặc Excel. Chạy lệnh sau để tạo controller và đặt code trong tệp tạo ra:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
php artisan make:controller UserController
php artisan make:controller UserController
php artisan make:controller UserController

app/Http/Controllers/UserController.php

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Maatwebsite\Excel\Facades\Excel;
use App\Imports\ImportUser;
use App\Exports\ExportUser;
use App\Models\User;
class UserController extends Controller
{
public function importView(Request $request)
{
return view('importFile');
}
public function import(Request $request)
{
Excel::import(new ImportUser, $request->file('file')->store('files'));
return redirect()->back();
}
public function exportUsers(Request $request)
{
return Excel::download(new ExportUser, 'users.xlsx');
}
}
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use Maatwebsite\Excel\Facades\Excel; use App\Imports\ImportUser; use App\Exports\ExportUser; use App\Models\User; class UserController extends Controller { public function importView(Request $request) { return view('importFile'); } public function import(Request $request) { Excel::import(new ImportUser, $request->file('file')->store('files')); return redirect()->back(); } public function exportUsers(Request $request) { return Excel::download(new ExportUser, 'users.xlsx'); } }
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Maatwebsite\Excel\Facades\Excel;
use App\Imports\ImportUser;
use App\Exports\ExportUser;
use App\Models\User;

class UserController extends Controller
{
    public function importView(Request $request)
    {
        return view('importFile');
    }

    public function import(Request $request)
    {
        Excel::import(new ImportUser, $request->file('file')->store('files'));
        return redirect()->back();
    }

    public function exportUsers(Request $request)
    {
        return Excel::download(new ExportUser, 'users.xlsx');
    }
}

Bước 9: Tạo Blade / View Files

Chúng ta đã đến bước cuối cùng. Ở đây, chúng ta cần tạo giao diện để xử lý Import và Export thông qua UI. Tạo tệp resources/views/importFile.blade.php và đặt code sau trong tệp đó:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
<!DOCTYPE html>
<html lang="{{ str_replace('_', '-', app()->getLocale()) }}">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Laravel 8 Import Export Excel & CSV File - TechvBlogs</title>
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.0/css/bootstrap.min.css">
</head>
<body>
<div class="container mt-5 text-center">
<h2 class="mb-4">
Laravel 8 Import Export Excel & CSV File - <a
href="https://techvblogs.com/blog/laravel-import-export-excel-csv-file?ref=repo"
target="_blank">TechvBlogs</a>
</h2>
<form action="{{ route('import') }}" method="POST" enctype="multipart/form-data">
@csrf
<div class="form-group mb-4">
<div class="custom-file text-left">
<input type="file" name="file" class="custom-file-input" id="customFile">
<label class="custom-file-label" for="customFile">Choose file</label>
</div>
</div>
<button class="btn btn-primary">Import Users</button>
<a class="btn btn-success" href="{{ route('export-users') }}">Export Users</a>
</form>
</div>
</body>
</html>
<!DOCTYPE html> <html lang="{{ str_replace('_', '-', app()->getLocale()) }}"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>Laravel 8 Import Export Excel & CSV File - TechvBlogs</title> <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.0/css/bootstrap.min.css"> </head> <body> <div class="container mt-5 text-center"> <h2 class="mb-4"> Laravel 8 Import Export Excel & CSV File - <a href="https://techvblogs.com/blog/laravel-import-export-excel-csv-file?ref=repo" target="_blank">TechvBlogs</a> </h2> <form action="{{ route('import') }}" method="POST" enctype="multipart/form-data"> @csrf <div class="form-group mb-4"> <div class="custom-file text-left"> <input type="file" name="file" class="custom-file-input" id="customFile"> <label class="custom-file-label" for="customFile">Choose file</label> </div> </div> <button class="btn btn-primary">Import Users</button> <a class="btn btn-success" href="{{ route('export-users') }}">Export Users</a> </form> </div> </body> </html>
<!DOCTYPE html>
<html lang="{{ str_replace('_', '-', app()->getLocale()) }}">

<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>Laravel 8 Import Export Excel & CSV File - TechvBlogs</title>
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.0/css/bootstrap.min.css">
</head>

<body>
    <div class="container mt-5 text-center">
        <h2 class="mb-4">
            Laravel 8 Import Export Excel & CSV File - <a
                href="https://techvblogs.com/blog/laravel-import-export-excel-csv-file?ref=repo"
                target="_blank">TechvBlogs</a>
        </h2>
        <form action="{{ route('import') }}" method="POST" enctype="multipart/form-data">
            @csrf
            <div class="form-group mb-4">
                <div class="custom-file text-left">
                    <input type="file" name="file" class="custom-file-input" id="customFile">
                    <label class="custom-file-label" for="customFile">Choose file</label>
                </div>
            </div>
            <button class="btn btn-primary">Import Users</button>
            <a class="btn btn-success" href="{{ route('export-users') }}">Export Users</a>
        </form>
    </div>
</body>

</html>

Chạy Ứng dụng Laravel

Cuối cùng, chúng ta phải chạy ứng dụng Laravel. Mở cửa sổ Terminal và chạy lệnh sau:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
php artisan serve
php artisan serve
php artisan serve

Sau khi thực thi lệnh này, truy cập vào địa chỉ http://localhost:8000/file-import trong trình duyệt của bạn.

Cảm ơn bạn đã đọc bài viết này.

Thành Nguyễn

Tôi là Thành, nên tôi đặt tên blog là Thành Nè, Thánh Né... là một coder cùi bắp (Code quèn). Chẳng giỏi viết lách, chỉ giỏi chém gió và có sở thích chia sẻ những kiến thức tôi đã từng...

Leave a Reply