こんにちは!トビログ管理人のとびうおです。
本日はLaravel 9にてcsvインポート機能を作成する方法について紹介していきます!
composerでインストール
今回はmaatwebsite/excelを使っていきますのでcomposerでinstallしていきます。
composer require maatwebsite/excel
これによって、excelをlaravelで読み込むときに使うライブラリがインストールできます。
bladeで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の中身は自分で変えてください)
formタグの中に
enctype=”multipart/form-data”
をつけることを忘れないように!
これで、bladeは完成しました。
コントローラーを以下のように作成する
飛ばす先のコントローラーで以下のように記述します。
$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のカラムに対してデータを挿入しています。
この時
use Illuminate\Support\Collection; use Maatwebsite\Excel\Facades\Excel;
を忘れないように!
やっていることの説明
まず
$sheets = Excel::toCollection(new Collection(), $request->file('file')->path(), null, \Maatwebsite\Excel\Excel::CSV);
です。
ここでは読み込んだcsvをコレクションにしています。
コレクションにしている理由は、laravelで取り扱いやすいからです。
第一引数でインポートするコレクション(今回は空なので new Collection()をしています)
第二引数でファイル(今回はフロントからfileというnameタグで渡しているので、
$request->file(‘file’)->path()としています)
第三引数でdisk(nullで基本大丈夫)
第四引数でどのようなtypeでインポートするのか(今回はcsvファイルなので、Excel::csvにしてあります)
このようにすることでcsvの中身がcollectionにいい感じに入ってくれます。
ここの処理が一番大切で、それ以降はBOMの削除をして、foreachにてUserに対してcreateをしていくという流れになります。
簡単にcsvを取り込める
このようにすると簡単にCSVをLaravelに取り込めるということが分かります!
簡単に取り込めるので
ぜひ作ってみてください!
他の記事もぜひ
このトビログでは他にも多くのlaravelの記事を公開しています!
ぜひほかの記事も見てみてくださいね!
コメント