エス技研

WordPress、CakePHP、PHP、baserCMSなどの Web系システムを中心に情報を提供します!


CakePHP3でPHPExcelを使ってエクセルファイルを生成、出力する方法

      2017/11/03

CakePHP3でPHPExcelを使ってエクセルファイルを生成、出力

 

PHPExcelをインストール

 
composerコマンドを使って PHPExcelをインストールします。
 

 
composerコマンドの使い方については、「CakePHP3でcomposerを利用してライブラリ・プラグインをインストールする方法」を参照してください。
 
composerコマンドを実行すると、「phpoffice/phpexcel」のパッケージがインストールされるだけではなく、CakePHP3で利用するために必要なファイルの更新も行ってくれます。
 
具体的には、ルートフォルダにある「/composer.json」「/composer.lock」ファイルが更新されます。
 
「/composer.json」には、「require」の値として、インストールしたパッケージの情報が追加されます。

 
また、「/composer.lock」には、ファイルのパスやバージョン、権限などの設定情報が追加されます。追加される情報はかなり多いので、ここでは割愛します。
 
 


 

CakePHP3でPHPExcelでエクセルファイルを読み込み、値を編集し、保存する処理のサンプル

 

CakePHP3でPHPExcelのプラグインを利用するために use句を記述

 
まず初めに、PHPExcelを利用するコントローラーに下記の「use句」を追記します。

 
設定にもよりますが、「/vendor/cakephp-plugins.php」や「/config/bootstrap.php」にプラグインをロードする処理を記述する必要はありません。
 
 

CakePHP3でPHPExcelを利用しエクセルファイルを出力する処理サンプル

 
ゼロからエクセルファイルを生成し、罫線を引いたり、セルの色を変更したり、という方法もありますが、より簡単な方法として、ここではあらかじめ作成したテンプレートファイルに、値を編集していく、という方法を解説します。
 
そのサンプルプログラムが以下になります。
 

 
それぞれコメントを書いているので分かるかと思いますが、最初に、テンプレートとして取得するファイル名などを指定します。
 
テンプレートのファイルは「$driPath」に編集していますが、「realpath(TMP) . "/excel/";」としています。
 
realpath(TMP)」は、「/tmp」に当たります。
「/tmp」の中に「excel」というフォルダを作って、その中にテンプレートとなるエクセルファイルを設置します。
 
ファイルの保存先のフォルダのパスについては、下記の記事を参考にしてください。
CakePHP3でDocumentRootやtmp、webroot、logsなどのフォルダへのパスの定数
CakePHP3でDocumentRootやwebroot、imgフォルダのURLやドメイン、パスを取得
 
 

2007形式(.xlsx形式)と 2003以前の形式(.xls形式)の切り替え

 
$reader = PHPExcel_IOFactory::createReader('Excel2007');」の「Excel2007」は、エクセルの 2007形式(.xlsx形式)で保存する指定です。
 
エクセルの 2003以前の形式(.xls形式)で保存する場合は、「Excel2007」の部分を「Excel5」に置き換えます。
 
 

ファイルを保存せずにダウンロードさせる方法

 
上記のサンプルは、所定のフォルダにエクセルファイルを保存する処理になっています。
ファイルを保存せずに、ダウンロードする場合は、「保存」の処理 3行を下記のものに差し替えます。(ソースコードに間違いがありましたので修正しました。2017.11.03)
 

 
上記の処理の

でも動作します。
ただ、ブラウザによっては、自動的にブラウザで開こうとしてしまうことがありますので、「application/octet-stream」の方がお勧めです。
 
また、ダウンロード処理の場合は、最後の行の「exit();」が必要です。
この「exit();」がないと「読み取れなかった内容を修復または削除することにより、ファイルを開くことができました。」「ファイルレベルの検証と修復が完了しました。このブックの一部が修復されたか、破棄された可能性があります。」と表示されてしまいますので、忘れないようにしましょう。
 

 

 
 

CakePHP3の関連記事

CakePHP3でPHP Simple HTML DOM Parserを使ってスクレイピングする方法
CakePHP3のInsert On Duplicate Key Update(upsert)構文を解説・バルク処理も
CakePHP3の1対多での連携を中間テーブルを使った多対多の連携に変更するときの手順
CakePHP3でデフォルトのソート条件を設定してユーザの選択肢たソート条件を有効にする方法
CakePHP3で Ajaxを使う方法の解説。3.6以降対応。Successとthenの両方を解説。
CakePHP3でパンくずの指定は HTMLヘルパーを使って指定する方法を解説
CakePHP3にOGPをfetch、asignを利用してテンプレートごとに指定する方法を解説
CakePHP3のOGPはHTMLヘルパーの$this->Html->meta()を使って設定
CakePHP3でkeywords、DescriptionをHTMLヘルパーを使って設定する
CakePHP3で環境変数を設定して本番環境と開発環境を分けて処理をする場合
 
その他の「CakePHP3」に関する記事一覧
 
 

 - CakePHP 2.x 3.x

GoogleAdwords

GoogleAdwords

最後までお読みいただきましてありがとうございます。
この記事が参考になったと思いましたらソーシャルメディアで共有していただけると嬉しいです!

Comment

  1. とおりすがり より:

    参考になりました。
    ありがとうございます。

    ちなみにダウンロードの場合の箇所で、$excelだと動かず、$bookだと動きました。
    $excel->setActiveSheetIndex(0);
    $writer = PHPExcel_IOFactory::createWriter($excel, ‘Excel2007’);

    • エス技研 より:

      とおりすがりさん、コメントありがとうございます。
       
      お役に立てて何よりですが、ソースコードが間違っておりまして申し訳ありません。
      指摘いただきました箇所、修正させていただきました。
       
      ありがとうございました。今後ともよろしくお願いします!

Message

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

下記の空欄を埋めてください。 * Time limit is exhausted. Please reload CAPTCHA.

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

※入力いただいたコメントは管理者の承認後に掲載されます。

  関連記事

CakePHP3でアソシエーション先のカラムでデータをソートして取得したい
CakePHP3でアソシエーション先のカラムでデータをソートして取得したい

アソシエーション先のテーブルのカラムをキーにソートをしたデータを取得したい!ときの記述方法を解説。「orderAsc()」ではなく「contain()」の中にSort条件を記述する。

CakePHP3のCakeDC/Usersでログインユーザの所有レコードのみ更新、削除する権限管理の設定方法
CakePHP3のCakeDC/Usersでログインユーザの所有レコードのみ更新、削除する権限管理の設定方法

CakePHP3のユーザ管理、ログイン認証プラグイン「CakeDC/Users」の権限管理を行う方法やアクセスできるコントローラー、アクションを設定、所有権を持つレコードのみ更新できる設定方法を解説。

CakePHP3のバージョンを指定してインストールする詳細な手順を解説
CakePHP3のバージョンを指定してインストールする詳細な手順を解説

CakePHP3のバージョンを指定してインストールする方法を詳細解説。CakePHP3のインストールはComposerを使うため設定もほぼ自動で完了。データベースの接続情報を記載すればアプリ開発のベースが整う。

VirtualBoxにCakePHP3を設置。必要なCentOS、Apache、PHP、MySQL、Composerをインストールし設定する。
VirtualBoxにCakePHP3を設置。必要なCentOS、Apache、PHP、MySQL、Composerをインストールし設定する

VirtualBoxにCentOS、Apache、MySQL、PHPをインストールするところから初めてCakePHP3の開発環境を構築する手順を詳細解説。この記事1つで全ての設定が完了する。

CakePHP3でパンくずの指定は HTMLヘルパーを使って指定する方法を解説
CakePHP3でパンくずの指定は HTMLヘルパーを使って指定する方法を解説

CakePHP3でパンくずの指定方法の解説。2つのヘルパーがあるが簡単なHTMLヘルパーを使った方法を、実際の状況に合わせて3つのパターン(エレメント化、ブロック化)にして解説。

CakePHP3のCakeDC/Usersの画面、メール本文テンプレートのカスタマイズ方法解説
CakePHP3のCakeDC/Usersの画面、メール本文テンプレートのカスタマイズ方法解説

CakeDC謹製Usersプラグインの紹介。ユーザ新規登録の流れを紹介しつつテンプレートファイルがどこにあるか、設定情報ファイルがどこにあるか、を説明しつつカスタマイズの方法を解説します。

CakePHP3のCakeDC/Users、Authでログインなしでもアクセスを許可する設定
CakePHP3のCakeDC/Users、Authでログインなしでもアクセスを許可する設定

CakePHP3の Authコンポーネントや CakeDC/Usersプラグインなどを利用したユーザ管理・認証システムにおいて、ログインしていなくても見ることができるページの設定方法を解説。

CakePHP3でWarning Error: SplFileInfo::openFile()エラーが発生した場合の対処方法
CakePHP3でWarning Error: SplFileInfo::openFile()エラーが発生した場合の対処方法

CakePHP3のキャッシュファイルのパーミッションエラー Error: SplFileInfo::openFile()が発生した場合の対応方法解説。app.phpにキャッシュファイルのパーミッション設定を行い、既存のファイルは削除。

CakePHP 2.3 Search Pluginで検索処理 その7queryを使って 日付の範囲検索

CakePHPの検索プラグイン Search Pluginの検索処理の中で queryを使って日付の範囲検索の方法です。

CakePHP2の検索Plugin CakeDC/Searchで重複を省くgroup by(distinct)の実装方法
CakePHP2の検索Plugin CakeDC/Searchで重複を省くgroup by(distinct)の実装方法

CakePHP2の検索プラグイン「CakeDC/Search」で、重複レコードを省くgroup by、distinctを使う方法についての解説。設定する場所はpaginatorの条件とするので、find()関数と同じ。