Edited at

【Laravel】Excelファイルをアップロードして読み込んで使う(DBを使わない方法)


環境

laradock

(PHP - 7.2)

(Laravel - 5.7)

※動作確認はローカルで行ってます。


追加プラグイン

PhpSpreadsheet


事前準備


PhpSpreadsheetの追加

dockerで構築しているので、まずはworkspaceにログインします。

cd <自分のpath>/laradock

docker-compose exec --user=laradock workspace bash

composerでPhpSpreadsheetを追加します

composer require phpoffice/phpspreadsheet


ファイルアップロード

ファイルアップロード時のバリデーションとエラーハンドリングは割愛します。


アップロード画面


resources/views/upload.blade.php

<!doctype html>

<form method="POST" action="/upload/" enctype="multipart/form-data">
{{ csrf_field() }}
<input type="file" id="file" name="file" class="form-control">
<div class="">
<button type="submit">アップロード</button>
</div>
</form>


UploadController


app/Http/Controllers/UploadController.php


<?php

namespace App\Http\Controllers;
use Illuminate\Http\Request;

class UploadController extends Controller
{
public function index()
{
return view('upload');
}

public function store(Request $request)
{
//デフォルトでは/storage/app/に保存される
$request->file('file')->storeAs('', 'upload_file.xlsx');
}
}



ルーティング


routes/web.php

Route::resource('/upload', 'UploadController');



アップロードを実行

アップロード画面のフォームでファイルを選択し、アップロードボタンを押します。


ファイルの確認

workspaceに接続

cd <自分のpath>/laradock

docker-compose exec --user=laradock workspace bash

storage/app/を確認

cd /storage/app

ll


ファイルの読み込み


ReadController.php


app/Http/Controllers/ReadController.php

<?php

namespace App\Http\Controllers;

class ImportController
{
public function read()
{
$reader = new \PhpOffice\PhpSpreadsheet\Reader\Xlsx();
$spreadsheet = $reader->load("/var/www/storage/app/upload_file.xlsx");
//0番目のsheetを読み込む
$sheet = $spreadsheet->getSheet(0);
//読み込んだsheetを配列にする
$sheetData = $sheet->toArray();
//3行3列目のcellを読み込む
$celldata = $sheetData[2][2];
//sheet名を取得する
$sheetName = $sheet->getTitle();
//*使いたいデータをreturnしよう
}
}



おまけ

.bladeファイルへの反映はこちらも参照してみてください。

【Laravel】Controllerで返したphpの配列をJavaScriptの配列に変換する


トラブルシューティング

・ファイルサイズが大きい場合

/etc/php.iniを書き換える必要があります。


php.ini

post_max_size = 8M

upload_max_filesize = 8M

・ControllerがClass not foundになる

Controllerのファイル名とClass名が一致しないと駄目なようです。

それらが一致していてもこのエラーが出る場合は、

workspaceでcomposer dump-autoloadを実行すると直ることがあるようです。


備考

DBアップロードされたファイルの情報をDBに追加するのであれば、

Laravel Excel

を使うのが良さそうです。

PhpSpreadsheetの前にLaravel Excelを触ってみましたが、データをDBに追加するのが大前提になっている作りでした。


参考文献

https://reffect.co.jp/laravel/how_to_upload_file_in_laravel