書籍「Laravelの教科書」Laravel13対応サポートガイド公開中 → ダウンロードはこちら

LaravelにExcelを簡単にインポートする方法【maatwebsite】

Laravelと連携:Excel・PDF・Google

Laravelでエクセル機能を使うには、maatwebsiteが超おすすめ。

エクセルのインポート・エクスポートがとても手軽にできます。

今回はインストール方法とインストール方法、そしてバリデーションの付け方を解説していきますね。

じゅんこ
じゅんこ

続編記事ではエクスポート方法を解説します。

maatwebsite のインストール・設定

まずはインストールから進めていきましょう。

今回テストで使った環境はLaravel8ですが、Laravel6でも動作確認済みです。

① maatwebsite/excelをインストール

下記コマンドでパッケージをインストールします。

composer require maatwebsite/excel

② configファイルに記述

app/configの中のapp.phpを開き、Providersの項目に下記を入力。

Maatwebsite\Excel\ExcelServiceProvider::class,

さらにAliasの項目に下記を入れてください。

'Excel'=>Maatwebsite\Excel\Facades\Excel::class,

③ 設定ファイルを作成

maatwebsite/excel用の設定ファイルを作成します。

php artisan vendor:publish --provider="Maatwebsite\Excel\ExcelServiceProvider"

app/configの中にexcel.phpファイルが出来ています。

ほぼデフォルトのままでOKですが、日本語のヘッダを利用したい場合は、111行目の ‘heading_row’の ‘formatter’ を ‘none’ にしておきましょう。

【変更前】

        'heading_row' => [
            'formatter' => 'slug',
        ],

【変更後】

        'heading_row' => [
            'formatter' => 'none',
        ],

以上でインストール完了です。

Excelファイルのインポート

それではまずは、Excelファイルをインポートしてみましょう。

下記のようなファイルをインポートするとします。

それでは、まずはインポートした情報を格納するデータベースから作っていきましょう。

① データベースの作成

下記コマンドで、モデルとマイグレーションファイルを作成します。

php artisan make:model Dango -m

app/Modelsの中にDango.phpモデルファイルができます。

データベーステーブルに値を入れられるよう、ファイルの中に、次の1行を加えます。

    protected $guarded = ['id'];

またdatabase/migrations の中にできるマイグレーションファイルには、次のように入力しておきましょう。

    public function up()
    {
        Schema::create('dangos', function (Blueprint $table) {
            $table->id();
            $table->string('dango');
            $table->integer('number');
            $table->string('date');
            $table->timestamps();
        });
    }

マイグレーションを実行します。

php artisan migrate

データベースにお団子テーブルができました。

② ルート設定

表示用のルート設定と、読み込み用のルート設定を作っておきます。

Route::get('/dango', 'DangoController@dango')->name('dango');
Route::post('/import', 'DangoController@import')->name('import');

③ ビューファイルの作成

resources/viewsの中にdango.blade.php を作成します。

次のように入れておきます。

<form action="{{ route('import') }}" method="POST" enctype="multipart/form-data">
	@csrf
	<div class="form-group">
		<input type="file" name="file">
		<br><br>
		<button class="btn btn-success">ボタンをクリック</button>
	</div>
</form>

④ インポート設定ファイルの作成

次に下記コマンドでインポート用のファイルを作成します。

php artisan make:import DangoImport --model=Dango

app/Imports に DangoImport.phpファイルが作成されます。

⑤ ヘッダ用の設定

・DangoImport.phpを開き、先頭に下記のuse宣言を加えておきます。

class名のあとにも【WithHeadingRow】と加えておきましょう。

use Maatwebsite\Excel\Concerns\WithHeadingRow;

・また一番上のモデル名は、Laravel7までの書き方になっています。

Laravel8~ご利用の場合は、app\Models\モデル名 と変更してくださいね。

・さらにmodelメソッドの中を次のルールで編集していきます。

    public function model(array $row)
{
return new モデル名([
‘データベースのカラム名‘=> $row[‘エクセルのカラム名‘],
]);
}
今回は、下記のようにいれておきます。
    public function model(array $row)
    {
        return new Dango([
            'dango'=>$row['お団子の種類'],
            'number'=>$row['数'],
            'date'=>$row['購入日']
        ]);
    }

編集後のファイルは下記のとおり。黄色で囲んだ部分が追加した箇所です。

じゅんこ
じゅんこ

なおヘッダは入れない場合には、WithHeadingRowは不要です。

$row[0] など、カラムの番号を入れてください。

④ コントローラーの設定

最後にコントローラーの設定です。

下記コマンドで団子用コントローラーを作成。

php artisan make:controller DangoController

app\Controllersの中にDangoController.phpファイルが出来ます。

DangoController.phpファイルを開き、一番上に、下記のuse宣言を入れておきましょう。

use App\Imports\DangoImport;
use Maatwebsite\Excel\Facades\Excel;

表示用とインポート用のメソッドを追加します。

ページ表示用はこちら。

    public function dango(){
        return view('dango');
    }

インポート用はこちら。

    public function import(){
        Excel::import(new DangoImport, request()->file('file'));
        return back();
    }

⑤ テスト

以上で準備完了。テストしてみましょう。

サーバーを起動し、/dangoを開くと、下記の画面が表示されます。

【ファイルを選択】でローカル上からエクセルファイルを選択し、【ボタンをクリック】

無事にインポートできれば、データベーステーブルの中にデータが入っています。

Excelファイルインポート前にバリデーションを入れる

エクセルファイルのインポートの際、バリデーションを加えることも可能です。

① バリデーションルールの追加

app/Importsの中のDangoImport.phpを開きます。

一番上に次のuse宣言を加えてください。

use Maatwebsite\Excel\Concerns\WithValidation;

class名のあとにも、WithValidation を追加します。

rulesメソッドにバリデーションルールを入れていきます。

書き方は次のとおり。

    public function rules(): array
{
return [
‘データベースのカラム名‘ => ‘バリデーションルール‘,
];
}

たとえば、dateカラムの入力を必須にするのであれば次のように入れます。

    public function rules(): array
    {
        return [
            'date' => 'required',
        ];
    }

オリジナルのエラーメッセージを表示したい場合は、バリデーションルールの下に、customValidationMessagesメソッドを追加します。

    public function customValidationMessages()
   {
    return [
        'date.required' => '購入日がありません',
    ];
   }

インポートファイルは次のようになります。

② エラー表示箇所の追加

またresources/viewsの中のdango.blade.phpファイルにエラーメッセージが表示される場所を作っておきます。

@if ($errors->any())
<div class="alert alert-danger">
	<ul>
		@foreach ($errors->all() as $error)
			<li>{{ $error }}</li>
		@endforeach
	</ul>
</div>
@endif

これで、バリデーションにひっかかった場合にはエラーメッセージが出てきます。

さいごに

以上で完了!
うまくいかない場合や、変な値がデータベースの中に入る場合、エクセルファイル上で右クリックして、セルの書式をチェックしてみてくだいね。

また重複防止や日時エラー対策など、関連記事に色々掲載しております。

困ったときには、併せて参考にしてみてください。

Laravelと連携:Excel・PDF・GoogleLaravel・PHP豆知識・トラブル対策

生成AIを「安全に」使うための研修・セミナー

お問い合わせ

生成AIの業務活用で気になるのは、効率だけでなくセキュリティです。 実践的な活用に加え、セキュリティ対策もお伝えします。

詳細を見てみる
 

生成AIを「安全に」使うための研修・セミナー

お問い合わせ

生成AIの業務活用で気になるのは、効率だけでなくセキュリティです。 実践的な活用に加え、セキュリティ対策もお伝えします。

詳細を見てみる

【Laravelの教科書・プレゼント】

Junko
Laravelの使い方を覚えたい!と思ったら、ぜひ、役立ててほしいです。 基礎編は無料でプレゼント中です♪
ひつじプログラマ
会員制サイトをいちから作っていくよ。ボタンをクリックして詳細を見てね。
Laravelの教科書の詳細を見る

最新版Laravel13への対応に対応。Laravel8からの各バージョンのテキストもご覧になれます♪

【無料プレゼント】

「LaravelでWebアプリをいちから作れるようになりたい!」

そんなLaravel初心者のあなたへ【Laravelの教科書】基礎編プレゼント中! 会員制フォーラムサイトを学習しながら作れます。

詳細はこちらをクリック

最新のLaravel13に対応。Laravel8からの各バージョンのテキストもご覧になれます♪

Laravelの本を書きました。


ひつじが目印♪

Laravelの使い方を分かりやすく解説した本を書きました。 書店やAmazon等のオンラインショップにて販売中
最新版Laravel13対応用サポートガイド(PDF)あり

書籍の詳細を見てみる

Laravelの本書きました。


ひつじが目印♪
クリックするとamazonページへ。
最新版Laravel13対応用
サポートガイド(PDF)あり

書籍の詳細を見てみる
シェアする
Twitter始めました。

コメント

タイトルとURLをコピーしました