CakePHP Excel

Excelファイルを出力する「PHPExcel」をCakePHP2.3.xで使う方法

2019/05/30

既存のExcelフォーマットへ、CakePHPで作成(蓄積)したデータを流しこむという処理があったので、PHPExcelを使ってみました。
今回もまた、忘備録を兼ねたポストです。

PHPExcelを使う

PHPExcelとは


PHPExcelとは、PHPでExcelファイルの加工・出力を行うためのフリーコンポーネントです。
Excel97-2003にも対応はしていますが、Excel2007に力を入れたコンポーネントのようです。

とのことで、PHPでExcelファイルを扱いたい、てな場面で活躍するコンポーネントと考えて下さい。

ダウンロード・設置

ダウンロード

PHPExcel Home

PHPExcel - Home

上記サイト、右の方の「DOWNLOAD」ボタンよりダウンロードします。

PHPExcel 1.7.9

この記事を書いた時点でのバージョンは、1.7.9でした。

解凍・設置

書庫ファイルを解凍します。

PHPExcel 解凍イメージ

上記は解凍したイメージ。
Classes 以下のフォルダ及びファイルを使用します。

今回は、CakePHP2.3.6で動作させるので、Classes 以下のフォルダ及びファイルを CakePHP の Vendorディレクトリ へコピーします。

PHPExcel 設置イメージ

コピー後のイメージは上記の感じで。

コントローラー

宣言

使用するコントローラーで以下の宣言を行います。
古いバージョンでも動いてほしい、要するに拡張子が「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

-CakePHP, Excel
-, , ,