このチュートリアルでは、Maatwebsite/Laravel-Excel パッケージを使用して PHP MySQL データベースと通信しながら、Laravel 8 アプリケーションで Excel および CSV ファイルを簡単にインポートおよびエクスポートする方法を学びます。
まず、ターミナルを開いて次のコマンドを実行して、新しい laravel プロジェクトを作成します。
composer create-project --prefer-dist laravel/laravel laravel-excel
または、Laravel インストーラーをグローバル Composer 依存関係としてインストールした場合:
laravel new laravel-excel
インストール後、プロジェクトのルート ディレクトリに移動し、.env ファイルを開き、次のようにデータベースの詳細を設定します。
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=<DATABASE NAME>
DB_USERNAME=<DATABASE USERNAME>
DB_PASSWORD=<DATABASE PASSWORD>
関連記事: Laravel で検証を使用してファイルと画像をアップロードする
Laravel Excelはcomposer経由でインストールできます。インストールするにはこのコマンドを実行する必要があります。
composer require maatwebsite/excel
次のコードをconfig/app.phpファイル内に配置できます 。
'providers' => [
Maatwebsite\Excel\ExcelServiceProvider::class,
],
'aliases' => [
'Excel' => Maatwebsite\Excel\Facades\Excel::class,
],
ベンダーを実行し、コマンドを公開し、構成を公開します。
php artisan vendor:publish --provider="Maatwebsite\Excel\ExcelServiceProvider" --tag=config
これにより、 という名前の新しい構成ファイルが作成されます config/excel.php。
最初のステップでは、ユーザー テーブルを移行します。移行が正常に実行された後、2 番目のステップに進みました。
php artisan migrate
第 2 ステップでは、偽のレコードを生成します。ここでは、tinker を使用して偽のレコードを生成します。要件に応じて別の方法を使用できます。
php artisan tinker
ティンカーを開いた後、このコマンドを実行してデータベースに偽のレコードを生成する必要があります。
User::factory()->count(100)->create();
このステップでは、ファイルのインポートおよびエクスポートのリクエストを処理するルートを追加します。
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');
Maatwebsite はインポート クラスを構築する方法を提供しており、それをコントローラーで使用する必要があります。したがって、新しい Import クラスを作成するのは素晴らしい方法です。したがって、次のコマンドを実行し、そのファイルの次のコードを変更する必要があります。
php artisan make:import ImportUser --model=User
app/Imports/ImportUser.php
<?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]),
]);
}
}
ここでは、CSV または Excel の列値を Eloquent モデルにマップすることができます。インポート クラスでマップするときに、その CSV または Excel 列をフォーマットする必要があります。
Maatwebsite はエクスポート クラスを構築する方法を提供しており、それをコントローラーで使用する必要があります。したがって、新しいエクスポート クラスを作成するのは素晴らしい方法です。したがって、次のコマンドを実行し、そのファイルの次のコードを変更する必要があります。
php artisan make:export ExportUser --model=User
app/Exports/ExportUser.php
<?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();
}
}
次に、CSV または Excel ファイルのレコードをアップロードするためのフォームを表示するコントローラーを作成する必要があります。UserController以下のコマンドを使用して、という名前のコントローラーを作成しましょう。
php artisan make:controller UserController
上記のコマンドを実行すると、 app/Http/Controllers ディレクトリ に コントローラー ファイル UserController.phpが作成されます。UserController.php ファイルを開き、このコードをそのファイルに挿入します。
<?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');
}
}
最後のステップに到達しました。一般に、ここではフロントエンドを介してインポートとエクスポートを処理するためのビューを定式化する必要があります。 ビューを設定するには、resources/views/importFile.blade.phpファイルを作成します 。次のコードをブレード ビュー ファイル内に配置します。
<!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>
最後に、Laravel アプリケーションを実行する必要があります。このためには、コマンド プロンプトに移動して、次のコマンドを記述する必要があります。
php artisan serve
このコマンドを実行した後、ブラウザでhttp://localhost:8000/file-import を開きます。