環境
laradock
(PHP - 7.2)
(Laravel - 5.7)
※動作確認はローカルで行ってます。
追加プラグイン
事前準備
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に追加するのが大前提になっている作りでした。