LoginSignup
1
3

More than 5 years have passed since last update.

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

Last updated at Posted at 2019-04-12

環境

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に追加するのが大前提になっている作りでした。

参考文献

1
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
3