【Cakephp】phpExcelをcakeで使ってみた

PHPExcel という素晴らしい機能がこの世には存在する。
その素晴らしい機能を使ってみた。

 

今回は、Excelをサーバ内に保存し、その後ダウンロードを行うという形式にする。

下準備として、Cake 上に保存するフォルダを作成しておく。
今回は、app/tmp/excelの下に保存したいと思う。

PHPExcelはテンプレート方式で形成されるらしい。
なので、同じ形式のExcelをダウンロードしたいときは、
先にExcelを準備しておく必要がある。

 

今回はテンプレートありの方式にする。
テンプレートは app/tmp/excel/tmp.xls として準備しておく。

それでは、いってみよー!!

 

1.PHPExcel をダウンロードするとこから始める。めんどい。
PHPExcel
2.zip を展開し必要なフォルダ・ファイルを取得する。
Classes の下にある PHPExcel フォルダと PHPExcel.php のみが必要になる。
そのほかは、いらない!!

PHPExcelフォルダとPHPExcel.php を Cake フォルダの app/Vender/のしたにコピー。

これでPHPExcel が使用可能になる!

3.Controller側の設定を行う! ボタンなどイベントを起こす先の関数に、設定を行う。

public function exportExcel(){
    // レイアウトは使わない
    $this->layout = false;

    // ファイル名を作成
    $fileName = date('YmdHis').'.xls';

    // 保存ファイルパス
    $upload = relpath(TMP);
    $upload .= '/excel/';
    $downloadPath = $upload.$fileName;

    $this->set(compact('fileName', 'downloadPath'));
}


4.View の設定を行う!(export_excel.ctp)
ここが肝心の内容だ…

まず、各ライブラリを呼ぶ。

<?php
// // エクセル出力用ライブラリ
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'));


次に、テンプレートを呼び出す

// エクセルシート
$objRender = PHPExcel_IOFactory::createReader("Excel5");

// テンプレートファイルフルパス
$template = realpath(TMP);
$template .= '/excel/';
$templatePath = $template."tmp.xls";

$PHPExcel = $objRender->load($templatePath);


次は、シートの設定を行う

// 表紙への出力
$PHPExcel->setActiveSheetIndex(0);  // 一番左のシート(0はSheet1)
$sheet = $PHPExcel->getActiveSheet();



そしてそして、内容を書き出す。
これはセルを指定して、書くことが可能。

    $sheet->setCellValue( 'A1', 'めんどくせ');


内容を書き出したら、保存じゃ!保存!

// 保存
$objWrite = new PHPExcel_Writer_Excel5($PHPExcel);
$objWrite->save($downloadPath);


保存したら、ダウンロードじゃ!ダウンロード!

// エクセルファイルをクライアントに出力
$convertFileName = mb_convert_encoding($fileName, 'sjis', 'utf-8');

//保存をしてから出力
Configure::write('debug', 0);  // debugコードを非表示
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment;filename="' . $convertFileName . '"');
readfile($downloadPath);


Excelは基本敵に sjis なので変換しないとダメだ。
これで、ダウンロードができたはず…!

 

基本、コピペで完成なので、難しいことは無いと思う。