PHPExcelをLaravelで利用する場合はサービスプロバイダー Laravel Excel が使えます。
HP: http://www.maatwebsite.nl/laravel-excel/
Github: https://github.com/Maatwebsite/Laravel-Excel
Laravel Excelのセットアップ
composer.jsonのrequireにパッケージを追加
// composer.json
"require": {
"laravel/framework": "4.2.*",
"maatwebsite/excel": "1.*"
},
Composerを更新する
$ php composer.phar update
or
$ composer update
providersとaliasに設定を追加
// app/config/app.php
'providers' => array(
...
'Illuminate\View\ViewServiceProvider',
'Illuminate\Workbench\WorkbenchServiceProvider',
'Maatwebsite\Excel\ExcelServiceProvider',
),
...
'aliases' => array(
...
'Validator' => 'Illuminate\Support\Facades\Validator',
'View' => 'Illuminate\Support\Facades\View',
'Excel' => 'Maatwebsite\Excel\Facades\Excel',
),
サンプルアプリケーション
Excelをアップロードして内容を表示するサンプルを作成してみます。
アップロードフォームの表示
// app/views/form.blade.php
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>
Laravel
</title>
</head>
<body>
{{ Form::open(array('url'=>'form-submit','files'=>true)) }}
{{ Form::label('file','File',array('id'=>'','class'=>'')) }}
{{ Form::file('file','',array('id'=>'','class'=>'')) }}
<br/>
<!-- submit buttons -->
{{ Form::submit('Save') }}
<!-- reset buttons -->
{{ Form::reset('Reset') }}
{{ Form::close() }}
</body>
</html>
サブミットされたExcelを読み込んで表示
// app/routes.php
Route::get('form', function(){
return View::make('form');
});
アップロードしたExcelの各セルを出力する処理をroutes.phpに直接書いています。
Excel::loadには、getReadPathで取得したパスを渡します。
loadで返されるLaravelExcelReaderはPHPExcelクラスのオブジェクトを委譲しているので、PHPExcelのメソッドをそのまま呼び出せます(参照: Docs For Class PHPExcel)。
// app/routes.php
Route::any('form-submit', function(){
$excel = App::make('excel');
$contents = "";
$reader = Excel::load(Input::file('file')->getRealPath());
// Getting all results
$reader->setActiveSheetIndex(0);
foreach ($reader->getActiveSheet()->getRowIterator() as $row) {
foreach ($row->getCellIterator() as $cell) {
if (!is_null($cell)) {
$contents .= $cell->getValue() . ", ";
}
}
$contents .= '<br>';
}
return Response::make($contents, 200)->header('Content-Type', 'text/html; charset=UTF-8');
});