既存のExcelファイルへ、データベースに蓄積したデータを流しこむという処理があったので、CakePHPから「PHPExcel」を使用する方法を備忘録としてポストします。
CakePHPで PHPExcel を使用する
PHPExcelとは
PHPExcelとは、PHPでExcelファイルの加工・出力を行うためのフリーのコンポーネントです。
Excel97-2003にも対応はしていますが、Excel2007に力を入れたコンポーネントとなるようです。
PHPでExcelファイルを扱いたい、という場面で活躍するコンポーネントと考えて下さい。
ダウンロード、設置方法
ダウンロードする
下記サイト、右の方の「DOWNLOAD」ボタンよりダウンロードします。
本日時点のスクショ

この記事を書いた時点でのバージョンは、1.7.9でした。
ファイル展開、設置する
DLした zip ファイルを解凍(展開)します。
上記は展開したイメージ。
Classes 以下のフォルダ及びファイルを使用します。
今回は、CakePHP2.3.6で動作させるので、Classes 以下のフォルダ及びファイルを CakePHP の Vendor ディレクトリへコピーします。
コピー後のイメージは上記の感じで。
コントローラーの編集
1. 出力するエクセルテンプレートへのパス定義
データを出力し、ダウンロードさせるためのエクセルファイルへのパスを bootstrap.php に定義します。今回の定義内容は以下のようにしてみました。
編集ファイル: app/Config/bootstrap.php
|
1 2 3 4 5 |
// テンプレ置き場 define('EXCEL_SHEET_PATH', WWW_ROOT . 'files/excel_sheet/'); // 出力パス define('OUTPUT_EXCEL_SHEET_PATH', WWW_ROOT . 'users/output_excel_sheet/'); |
2. 宣言する
使用するコントローラーで以下の宣言を行います。
「古いバージョンでも動いてほしい」というか、「拡張子が xls のファイルでDLしたい」との要請があったので、今回は Excel95 用の Reader を読み込ませて使用します。
拡張子と対応する Reader を表にすると以下となります。
| 拡張子 | 対応するReader |
|---|---|
| xls | PHPExcel_Reader_Excel5 |
| xlsx | PHPExcel_Reader_Excel2007 |
| ods | PHPExcel_Reader_OOCalc |
| slk | PHPExcel_Reader_SYLK |
| xml | PHPExcel_Reader_Excel2003XML |
| gnumeric | PHPExcel_Reader_Gnumeric |
| csv | – |
今回は UsersController.php で使うので、UsersController.php に宣言文を記述します。
読めばわかると思いますが、app/Vendor/phpecel/PHPExcel/ 以下の各ファイルへのパスを設定しているだけです。
編集ファイル: app/Controller/UsersController.php
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
App::import( 'Vendor', 'PHPExcel_IOFactory', array('file'=>'phpexcel' . DS . 'PHPExcel' . DS . 'IOFactory.php') ); App::import( 'Vendor', 'PHPExcel_Cell_AdvancedValueBinder', array('file'=>'phpexcel' . DS . 'PHPExcel' . DS . 'Cell' . DS . 'AdvancedValueBinder.php') ); // Excel95用ライブラリ App::import( 'Vendor', 'PHPExcel_Writer_Excel5', array('file'=>'phpexcel' . DS . 'PHPExcel' . DS . 'Writer' . DS . 'Excel5.php') ); App::import( 'Vendor', 'PHPExcel_Reader_Excel5', array('file'=>'phpexcel' . DS . 'PHPExcel' . DS . 'Reader' . DS . 'Excel5.php') ); class UsersController extends AppController { // モデル var $uses = array('User'); 以下略 } |
3. データ取得
次に、使用したいアクション内で出力データを取得します。
これはPHPExcelは関係なく、普通に条件を指定して find するだけです。
|
1 2 3 4 |
// データを取得 $users = $this->User->find( 'all', // 条件等は省略 ); |
4. 出力設定
使用するテンプレートファイル、出力するファイル名や出力パスなどを細かく指定。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
// EXCELシート(テンプレ)読み込み $_read_sheet = EXCEL_SHEET_PATH . "template_users.xls"; // 年_月ディレクトリがあるか調査、無ければ作成 $ym_dirname = date("Y") . '_' . date("m"); if ( !file_exists(OUTPUT_EXCEL_SHEET_PATH . 'user/' . $ym_dirname) ) { mkdir(OUTPUT_EXCEL_SHEET_PATH . 'users/' . $ym_dirname, 0707); } // ファイル名「年月」 $output_file_name = "USER_REPORT_" . date("YmdHis", time()); // 出力ファイル名設定 $output_file = $output_file_name . ".xls"; // 出力パスを含む、ファイル名 $output_file_path = 'user/' . $ym_dirname . '/' . $output_file; // 文字コード変換 $output_file = mb_convert_encoding($output_file, "SJIS", "UTF-8"); // テンプレを読み込んで、PHPExcelオブジェクトを生成する。 $reader = PHPExcel_IOFactory::createReader('Excel5'); $xl = $reader->load("$_read_sheet"); |
5. シートの選択
|
1 2 |
$xl->setActiveSheetIndex(0); // 0番目のシートを選択 $sheet = $xl->getActiveSheet(); // 選択シートの情報取得 |
6. セルへ書込み
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
// セル「A1」に「エクセルファイル」という文字列を書き込み $objSheet->setCellValue("A1", "エクセルファイル"); // セル「B2」に今日の日付を挿入 $objSheet->setCellValue("B2", date("Y/m/d")); $line = 3; foreach ($users AS $key => $val) { // セル「A3」に ID を挿入 $sheet->setCellValue("A".$line, Sanitize::clean($val['id'])); // セル「B3」に UserName を挿入 $sheet->setCellValue("B".$line, Sanitize::clean($val['username'])); $line++; } |
7. ファイル保存
|
1 2 3 4 5 |
// xls形式で保存 $writer = PHPExcel_IOFactory::createWriter($xl, 'Excel5'); // 指定パスに出力 $writer->save(OUTPUT_EXCEL_SHEET_PATH . $output_file_path); |
これで指定したパス、今回だと以下のパスに保存されます。
public_html/users/output_excel_sheet/user/2013_09/USER_REPORT_20130901130545.xls
参考にしたサイト様




