【ECCUBE】PHPExcelを使って注文情報をExcelファイルでダウンロードできるようにする
ECCUBEで通販サイトを運営する上で、社内的に伝票をカスタマイズしたいときとかありますよね。
受注情報の一覧をCSV形式でダウンロードすることはできますが、Excelで一発ダウンロードはできません。
そこでPHP拡張ライブラリのPHPExcelを導入して、Excelファイルで自在にカスタマイズされた帳票をダウンロードできるようにします。
まったく難しくはないですが、クラスファイルなどはご自身の環境に合わせた作りをする必要がありますので、ご注意を。
PHPExcelライブラリはこちらから最新版をあらかじめダウンロードしてください。
実際に修正を行ったECサイトのバージョンは以下の通りです。
- EC-CUBE:2.13.1
- PHP:5.3.15
手順1、テンプレートファイルにExcelファイルダウンロード用のボタンを設置
<tr> <th>Excel file download</th> <td> <a href="javascript:;" class="btn-normal" name="excelexport" onclick="eccube.setModeAndSubmit('excelexport','','');">Excel出力</a> </td> </tr>
手順2、data/class_extends/page_extends/内に以下を保存
場所は環境にあわせたりと、問題のない場所に配置してください。
- PHPExcelフォルダ
- PHPExcel.phpファイル
手順3、個別の受注情報ページ内でExcelダウンロード実行
LC_Page_Admin_Order_Edit.phpファイル内の178行目辺りにあるswitch文に『case ‘excelexport’:』ブロックをつくり、その中で『$this->doOutputExcel($objFormParam);』を実行します。
たいてい受注情報は「$objFormParam」に入ってるかと思いますが、そのあたりもそれぞれの環境にあわせてください。
case 'excelexport': //LC_Page_Admin_Order.phpの「doOutputExcel」メソッドを呼び出し $this->doOutputExcel($objFormParam); SC_Response_Ex::actionExit(); break;
手順4、ダウンロード機能をもったHelperクラスにExcel生成を投げるメソッド
LC_Page_Admin_Order.phpファイル内ならどこでもいいんですが、「doOutputCSV()」メソッドの下、430行目辺りに「doOutputExcel()」メソッドを追記して、HelperクラスのExcelファイルをダウンロードするメソッドを呼び出す
public function doOutputExcel($objFormParam){ $objExcel = new SC_Helper_Excel_Ex(); $objExcel->sfDownloadExcel($objFormParam); }
手順5、Excelファイルをダウンロードするためのヘルパークラスファイル2つを作成する
- /data/class/helper/SC_Helper_Excel.php
- /data/class_extends/helper_extends/SC_Helper_Excel_Ex.php
♦ /data/class_extends/helper_extends/SC_Helper_Excel_Ex.phpファイルを作る
クラスファイルSC_Helper_Excel_Exを作成します。SC_Helper_Excel_Ex.phpを複製すると早いでしょう。
require_once CLASS_REALDIR . 'helper/SC_Helper_Excel.php'; /** * @package Helper */ class SC_Helper_Excel_Ex extends SC_Helper_Excel { }
♦ /data/class/helper/SC_Helper_Excel.phpファイルを作る
クラスファイルSC_Helper_Excelを作成します。SC_Helper_CSV.phpを複製すると早いでしょう。
PHPExcelモジュールを利用してExcelファイルとしてはき出せるようにするプログラムです。
<?php /** * PHPExcel require * PHPExcelライブラリを「page_extends/」内に配置していますが、場所はお好みで。 */ require_once CLASS_EX_REALDIR . 'page_extends/PHPExcel.php'; /** * Excel 関連 のヘルパークラス. * * @package Page * @author A.Hiruta * @version 1.0 */ class SC_Helper_Excel extends PHPExcel { /** * デフォルトコンストラクタ. */ public function __construct() { $this->init(); } /** * なにか初期化するものあればする. * * @access private * @return void */ public function init() { //初期化 } /** * Excelファイルを送信する * * @author A.Hiruta * @param array $objFormParam 個別受注情報の連想配列 */ public function sfDownloadExcel($objFormParam){ //渡ってきた受注データのオブジェクトを配列に $hogevar = $objFormParam->getHashArray(); //Excelファイルをつくる $xfile = new PHPExcel(); $xfile->setActiveSheetIndex(0); $sheet = $xfile->getActiveSheet(); $sheet->setTitle('シートのタイトル');//シートのタイトル(左下にあるタブ) $sheet->setCellValue('A1',$hogevar["fuga"]);//セルに値を設定 //Excel2003形式で保存 $writer = PHPExcel_IOFactory::createWriter($xfile,'Excel5'); //$writer = PHPExcel_IOFactory::createWriter($xfile,'Excel2007');//2007の場合はコッチ $file_name = 'excel_file_name.xls'; $writer->save($file_name); //HTTPヘッダを出力 Header("Content-disposition: attachment; filename={$file_name}"); Header("Content-type: application/octet-stream; name={$file_name}"); Header('Cache-Control: '); Header('Pragma: '); //Excelファイルを送る echo file_get_contents($file_name); //テンポラリなファイルを削除 unlink($file_name); }
手順6、最後にJavascriptの修正
これをやらないと、管理画面でExcelファイルのダウンロードを実行したあと別の情報を変更してページを更新しようとしたとき、再びExcelファイルをダウンロードしようとします。
なので『/js/eccube.js』129行目あたりの一部を修正します。
使用したモードを元に戻すという処理です。
//Line:129 eccube.setModeAndSubmit = function(mode, keyname, keyid) { switch(mode) { case 'delete_category': if(!window.confirm('選択したカテゴリとカテゴリ内の全てのカテゴリを削除します')){ return; } break; case 'delete': if(!window.confirm('一度削除したデータは、元に戻せません。\n削除しても宜しいですか?')){ return; } break; case 'confirm': if(!window.confirm('登録しても宜しいですか')){ return; } break; case 'delete_all': if(!window.confirm('検索結果を全て削除しても宜しいですか')){ return; } break; //ここでいったん最初のmodeの状態を変数に入れてやります。 case 'excelexport': var tmpval = document['form1']['mode'].value; break; //ここまで追記 default: break; } document['form1']['mode'].value = mode; if(keyname !== undefined && keyname !== "" && keyid !== undefined && keyid !== "") { document['form1'][keyname].value = keyid; } document['form1'].submit(); //ここで再度modeを最初の状態に戻してあげます。 switch(mode) { case 'excelexport': document['form1']['mode'].value = tmpval; break; } //ここまで追記 };
※ 注意点として、当然ですが「LC_Page_Admin_Order_Edit.php」などはEC-CUBEをバージョンアップするときは上書きされるので、その可能性がある場合はあらかじめ拡張ファイルへの記述をしてください。
また、PHPExcel本体の配置場所についても、規約に従った場所がいいでしょう。
※ テンポラリーなファイルの保存先はclassディレクトリではなく、違う場所に設定したほうが良いでしょう。
※ 用途にあわせてヘルパークラス内に必要なメソッドなど、好きなだけ作ってくださいw
いつも読んでくれてありがとね!