たきゃはしです

もう日常ブログにしよう

CakePHP2 - CSVダウンロード(エクスポート)ヘルパー「FastCSV」

2012/09/25 更新


とりあえずCake2に対応しました

FastCSV」は、プラグイン管理されていますが、実質ヘルパーです。一般的なCSVヘルパーとしてダウンロード(エクスポート)を実装しています。

また「fastExport」という、テーブル1つをまるまるCSVファイルにしちゃうメソッドも実装しました。

インストール・初期設定

  • app/Config/bootstrap.php にて以下の記述を行う。
    • CakePlugin::load('FastCSV');
  • 目的のコントローラにて以下の記述を行う。
    • public $helpers = array('FastCSV.FastCSV');

fastExport機能について

CakePHPを使っていれば、findで抽出したデータをそのままCSVにしたいはずです。
以下のコードはusersテーブルの内容をそのままCSVファイルとしてエクスポートします。

・コントローラ

App::uses('AppController', 'Controller');

class CsvController extends AppController {

    public $name = 'Csv';
    public $uses = array('User');
    public $helpers = array('FastCSV.FastCSV');
    public $layout = false;

    public function download() {
        $this->User->recursive = 0; //1つのCSVにつき、モデルは1つです。
        $users = $this->User->find('all'); //表は二次元であるため、"all"で取得します。
        $this->set('users', $users); //ビューにセットします。
    }

}

・ビュー

echo $this->FastCSV->fastExport($users, 'ユーザー表', 'User');


コードはたったこれだけで、「csv/download」からダウンロード可能です。


それでは今回使用した「fastExport機能」について詳しく解説していきます。

  • 説明
    • array fastExport ( array $table [, string $filename = null [, mixed $modelClass = false]] )
  • パラメータ
    • table
      • CSVにしたい配列。実はfindで抽出したデータじゃなくても、fastExport機能は利用可能です。
    • filename
      • ファイル名。CSVファイルとして出力する際のファイル名を指定してください。拡張子「.csv」はつけてもつけなくても構いません。日本語でも大丈夫です。省略した場合は「ExportFile.csv」として出力されます。
    • modelClass
      • モデルクラス名。$tableがfindで抽出したデータの場合は指定してください。例えば「'User'」 もしfindを使っていない二次元配列の場合は省略してください。

一般的なCSVヘルパー機能の利用

設定をカスタマイズしたい場合や、CakePHPのfindを利用していない場合など有効です。

・コントローラ
アクションは空です。

・ビュー

$fruits = array(
    array('いちご', '赤', 6),
    array('ぶどう', '紫', 4),
    array('ばなな', '黄', 20),
);
$add_fruit = array('りんご', '赤', 13);
$thead = array('名前', '色', '大きさ');
$thoot = array('name', 'color', 'length',);

//設定
$this->FastCSV->filename = 'フルーツ表';
$this->FastCSV->delimiter = ',';
$this->FastCSV->enclosure = '"';
$this->FastCSV->to_encoding = 'sjis';
$this->FastCSV->from_encoding = 'utf8';

//表をセット
$this->FastCSV->setRows($fruits);
$this->FastCSV->setRow($add_fruit);
$this->FastCSV->setLastRow($thoot);
$this->FastCSV->setFirstRow($thead);

//エクスポート
$this->FastCSV->export();


上記は従来のよくあるCSVヘルパーの動作ですね。この辺のメソッドについてはソースを読んでもらえれば助かります。コメントもちゃんと書いてますので。笑

なにか要望やアドバイスがあれば機能追加します。