Laravel 9でcsvインポート/読み込みを行う

こんにちは!トビログ管理人のとびうおです。

本日はLaravel 9にてcsvインポート機能を作成する方法について紹介していきます!

composerでインストール

今回はmaatwebsite/excelを使っていきますのでcomposerでinstallしていきます。

composer require maatwebsite/excel

これによって、excelをlaravelで読み込むときに使うライブラリがインストールできます。

bladeでcsvをアップロードするフォームを作成する

以下のようなフォームを作成してあげましょう。

Laravel 9でcsvインポート/読み込みを行う
Laravel 9でcsvインポート/読み込みを行う
<form action="###" method="post" enctype="multipart/form-data">
                    @csrf
                    <div id="app">
                        <div class="text-center">
                            <label>
                                <input type="file" name="file">csvファイルを選択
                            </label>
                            <p>選択されていません</p>
                        </div>
                        <div class="text-center mt-3">
                            <button class="button-green">送信</button>
                        </div>
                    </div>
                </form>

(※formのactionの中身は自分で変えてください)

とびうお<br>
とびうお

formタグの中に

enctype=”multipart/form-data”
をつけることを忘れないように!

これで、bladeは完成しました。

コントローラーを以下のように作成する

飛ばす先のコントローラーで以下のように記述します。

Laravel 9でcsvインポート/読み込みを行う
Laravel 9でcsvインポート/読み込みを行う
$sheets = Excel::toCollection(new Collection(), $request->file('file')->path(), null, \Maatwebsite\Excel\Excel::CSV);
        $rows = $sheets[0];
        $header = $rows->shift();
        //BOM削除
        $header[0] = preg_replace('/^\xEF\xBB\xBF/', '', $header[0]);
        if ($header[0] !== "タイトル1" || $header[1] !== "タイトル2" || $header[2] !== "タイトル3") {
            return redirect()->back()->withErrors("CSVヘッダはタイトル1・タイトル2・タイトル3である必要があります。");
        }
        $i = 1;
        foreach ($rows as $row) {
            if (count($row) != count($header)) {
                continue;
            }
            $title1 = $row[0];
            $title2 = $row[1];
            $title3 = $row[2];
            $data = [
                'title1' => $title1,
                'title2' => $title2,
                'title3' => $title3,
            ];

            User::create([
                'title1'=>$title1,
                'title2'=>$title2,
                'title3'=>$title3,
            ]);
            $i++;
        }

今回はUsersテーブルのtitle1,title2,title3のカラムに対してデータを挿入しています。

とびうお<br>
とびうお

この時

use Illuminate\Support\Collection;
use Maatwebsite\Excel\Facades\Excel;

を忘れないように!

やっていることの説明

まず

Laravel 9でcsvインポート/読み込みを行う
Laravel 9でcsvインポート/読み込みを行う
        $sheets = Excel::toCollection(new Collection(), $request->file('file')->path(), null, \Maatwebsite\Excel\Excel::CSV);

です。

ここでは読み込んだcsvをコレクションにしています。

コレクションにしている理由は、laravelで取り扱いやすいからです。

コレクション 9.x Laravel

第一引数でインポートするコレクション(今回は空なので new Collection()をしています)

第二引数でファイル(今回はフロントからfileというnameタグで渡しているので、
$request->file(‘file’)->path()としています)

第三引数でdisk(nullで基本大丈夫)

第四引数でどのようなtypeでインポートするのか(今回はcsvファイルなので、Excel::csvにしてあります)

とびうお<br>
とびうお

このようにすることでcsvの中身がcollectionにいい感じに入ってくれます。

ここの処理が一番大切で、それ以降はBOMの削除をして、foreachにてUserに対してcreateをしていくという流れになります。

簡単にcsvを取り込める

このようにすると簡単にCSVをLaravelに取り込めるということが分かります!

とびうお<br>
とびうお

簡単に取り込めるので
ぜひ作ってみてください!

他の記事もぜひ

このトビログでは他にも多くのlaravelの記事を公開しています!

ぜひほかの記事も見てみてくださいね!

Laravel
「Laravel」の記事一覧です。
とびうお
ブログ管理人です!
swimaneというアプリをリリースしました!

コメント

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