PHPでエクセルデータをアップロードしてデータを取り出す

maatwebsite/excelっていうパッケージがあってLaravelで開発するぶんには何もしなくてよいです。

インストール

インストールします。(2019-03-28現在の最新版は3.1.10でした)

php composer.phar require "maatwebsite/excel:~3.1.10"

後述しますが、3系のパッケージは読み込みの機能がなくなったようです。(前回の方々がなんで?って言ってます)
ですので、エクセルの読み込み機能が必要なときは2系のパッケージをインストールしないと駄目です。

php composer.phar require "maatwebsite/excel:~~2.1.0"

ちゃんと試していませんが、2系だったらなんでもよさそう。

Error

こういうエラーが出るときがあるのですが、PHPのモジュールが足りない場合がほとんどです。php -mkphpのzipモジュールが入ってないのが原因でした。

Installation failed, reverting ./composer.json to its original content.

関連して以下のような詳細になります。

Your requirements could not be resolved to an installable set of packages.

  Problem 1
    - maatwebsite/excel 3.1.10 requires phpoffice/phpspreadsheet ^1.6 -> satisfiable by phpoffice/phpspreadsheet[1.6.0].
    - maatwebsite/excel 3.1.8 requires phpoffice/phpspreadsheet ^1.6 -> satisfiable by phpoffice/phpspreadsheet[1.6.0].
    - maatwebsite/excel 3.1.9 requires phpoffice/phpspreadsheet ^1.6 -> satisfiable by phpoffice/phpspreadsheet[1.6.0].
    - maatwebsite/excel 3.1.x-dev requires phpoffice/phpspreadsheet ^1.6 -> satisfiable by phpoffice/phpspreadsheet[1.6.0].
    - phpoffice/phpspreadsheet 1.6.0 requires ext-zip * -> the requested PHP extension zip is missing from your system.
    - Installation request for maatwebsite/excel ~3.1.8 -> satisfiable by maatwebsite/excel[3.1.10, 3.1.8, 3.1.9, 3.1.x-dev].

ここら辺りを実行したらzipモジュールが使えるようになってmaatwebsite/excelがコンポーザーで落とせると思います。

yum install zlib-devel zlib
yum --enablerepo=remi,remi-php73 install php-pecl-zip

確認

php -m | grep "zip"
zip

が出ればOK

composer update
(または、composer install)

とかやる。

セッティング

例によってapproot\config\app.phpに以下を記述します。

プロバイダー追加

'providers' => [
   ...
   Maatwebsite\Excel\ExcelServiceProvider::class,
   ...

エイリアスの追加

'aliases' => [
  ...
  'Excel' => Maatwebsite\Excel\Facades\Excel::class,
  ...

うまく反映されないときはartisanコマンドを一通りやるかcomposer updateとかcomposer installとかいろいろ。

使い方

読み込み

ver3では読み込みの機能が排除されてしまいました。ver2系だけで使えるメソッドになります。

$reader = Excel::load($file_path);
$rows = $reader->toArray();
// あるいは $rows = Excel::load($file->getRealPath(),function($reader){})->get();
foreach ($rows as $row){
  var_dump($row);
}

$readerを直接ダンプすると大量のオブジェクトが取れてくるのでメモリがオーバーフローするはず。$reader->toArray()で取得してforeachでまわしてあげると値が取れます。
実際は複数のシートも取得できたりするので、オブジェクトの中身を見て値を取る感じになります。
しかしエクセルの一行目の値がそれぞれの行のキーになっている配列が返ってくるのって親切すぎる感じがしないでもない。

書き込み

ちょっと時間ないので後ほど。

Last update: 2019.03.28 (木)