
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
[php]
'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');
以下略
}
[/php]
読めばわかると思いますが、app/Vendor/phpecel/PHPExcel/ 以下の各ファイルへのパスを設定しているだけです。
データ取得
使用したいアクション内で、以下のように処理していきます。
まずは出力データの取得から。
[php]
// データを取得
$users = $this->User->find( 'all',
略
);
[/php]
テンプレ読み込み
bootstrap.php にて パスなどを define で定義しています。
define 内容は以下のようにしてみました。
[php]
// テンプレ置き場
define('EXCEL_SHEET_PATH', WWW_ROOT . 'files/excel_sheet/');
// 出力パス
define('OUTPUT_EXCEL_SHEET_PATH', WWW_ROOT . 'users/output_excel_sheet/');
[/php]
本処理に戻り、使用するテンプレ、出力するファイル名や場所などを指定。
[php]
// 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");
[/php]
シートの選択
[php]
$xl->setActiveSheetIndex(0); // 0番目のシートを選択
$sheet = $xl->getActiveSheet(); // 選択シートの情報取得
[/php]
セルへ書込み
[php]
// セル「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++;
}
[/php]
ファイル保存
[php]
// xls形式で保存
$writer = PHPExcel_IOFactory::createWriter($xl, 'Excel5');
// 指定パスに出力
$writer->save(OUTPUT_EXCEL_SHEET_PATH . $output_file_path);
[/php]
これで指定したパス、今回だと
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