Excelファイルを出力する「PHPExcel」をCakePHP2.3.xで使う方法
2019/05/30
既存のExcelフォーマットへ、CakePHPで作成(蓄積)したデータを流しこむという処理があったので、PHPExcelを使ってみました。
今回もまた、忘備録を兼ねたポストです。
PHPExcelを使う
PHPExcelとは
PHPExcelとは、PHPでExcelファイルの加工・出力を行うためのフリーコンポーネントです。
Excel97-2003にも対応はしていますが、Excel2007に力を入れたコンポーネントのようです。
とのことで、PHPでExcelファイルを扱いたい、てな場面で活躍するコンポーネントと考えて下さい。
ダウンロード・設置
ダウンロード
上記サイト、右の方の「DOWNLOAD」ボタンよりダウンロードします。
この記事を書いた時点でのバージョンは、1.7.9でした。
解凍・設置
書庫ファイルを解凍します。
上記は解凍したイメージ。
Classes 以下のフォルダ及びファイルを使用します。
今回は、CakePHP2.3.6で動作させるので、Classes 以下のフォルダ及びファイルを CakePHP の Vendorディレクトリ へコピーします。
コピー後のイメージは上記の感じで。
コントローラー
宣言
使用するコントローラーで以下の宣言を行います。
古いバージョンでも動いてほしい、要するに拡張子が「xls」のファイルが良い!との要請があったので、Excel95用を読み込ませて使用します。
ちなみに、拡張子と対応するReadrを表にすると、以下となります。
拡張子 | 対応するReadr |
---|---|
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 | - |
※PHPExcel-1.7 テンプレートファイルの読み込み PHPExcel_IOFactory::createReader PHPExcel_IOFactory::load
あたもこ様より転載。
今回は UsersController.php で使う事とします。
app/Controller/UsersController.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
<?php // Excel出力用ライブラリ App::import( 'Vendor', 'PHPExcel', array('file'=>'phpexcel' . DS . 'PHPExcel.php') ); 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'); 以下略 } |
読めばわかると思いますが、app/Vendor/phpecel/PHPExcel/ 以下の各ファイルへのパスを設定しているだけです。
データ取得
使用したいアクション内で、以下のように処理していきます。
まずは出力データの取得から。
1 2 3 4 |
// データを取得 $users = $this->User->find( 'all', 略 ); |
テンプレ読み込み
bootstrap.php にて パスなどを define で定義しています。
define 内容は以下のようにしてみました。
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/'); |
本処理に戻り、使用するテンプレ、出力するファイル名や場所などを指定。
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"); |
シートの選択
1 2 |
$xl->setActiveSheetIndex(0); // 0番目のシートを選択 $sheet = $xl->getActiveSheet(); // 選択シートの情報取得 |
セルへ書込み
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
// セル「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++; } |
ファイル保存
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
に保存されます。
参考にしたサイト様
◆PHPExcelで、PHPからExcelを作成・操作する | Styler
◆PHPExcel-1.7 テンプレートファイルの読み込み PHPExcel_IOFactory::createReader PHPExcel_IOFactory::load