cakephpでCSV出力をする場合、CsvViewプラグインを利用すると、とても簡単に実現できます。
詳しい説明は、公式サイトに記載されている内容で、問題なく利用できると思います。
公式サイト
https://github.com/FriendsOfCake/cakephp-csvview
今回は、下記の環境で利用する場合の補足を説明しています。
- 環境
- CakePHP 3.8.13
インストール
1 |
composer require friendsofcake/cakephp-csvview |
プラグイン有効化
1 |
bin/cake plugin load CsvView |
手動でプラグインを有効化する場合には、
下記のファイルにプラグイン読み込みを追記します。
1 |
Application.php |
bootstrap()メソッドに、下記を追加
1 |
$this->addPlugin('CsvView'); |
サンプルプログラム
シンプル出力
コントローラーに、下記のメソッドを追加します。
1 2 3 4 5 6 7 8 9 10 11 12 |
public function export() { $data = [ ['a', 'b', 'c'], [1, 2, 3], ['you', 'and', 'me'], ]; $_serialize = 'data'; $this->viewBuilder()->setClassName('CsvView.Csv'); $this->set(compact('data', '_serialize')); } |
$_serialize にデータの変数名を指定
viewBuilder()で`CSvView.CSVを指定
$this->setで$data と$_serialize をビューに渡す
ヘッダー、フッターを出力する場合
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
public function export() { $data = [ ['a', 'b', 'c'], [1, 2, 3], ['you', 'and', 'me'], ]; $_serialize = 'data'; $_header = ['Column 1', 'Column 2', 'Column 3']; $_footer = ['Totals', '400', '$3000']; $this->viewBuilder()->setClassName('CsvView.Csv'); $this->set(compact('data', '_serialize', '_header', '_footer')); } |
改行やデリミタの指定方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
public function export() { $data = [ ['a', 'b', 'c'], [1, 2, 3], ['you', 'and', 'me'], ]; $_serialize = 'data'; $_delimiter = chr(9); //tab $_enclosure = '"'; $_newline = '\r\n'; $_eol = '~'; $_bom = true; $this->viewBuilder()->setClassName('CsvView.Csv'); $this->set(compact('data', '_serialize', '_delimiter', '_enclosure', '_newline', '_eol', '_bom')); } |
データベースの内容を出力
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
public function export() { $posts = $this->Posts->find(); $_serialize = 'posts'; $_header = ['Post ID', 'Title', 'Created']; $_extract = [ 'id', function (array $row) { return $row['title']; }, 'created' ]; $this->viewBuilder()->setClassName('CsvView.Csv'); $this->set(compact('posts', '_serialize', '_header', '_extract')); } |
viewにcsvを関連付ける場合
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
// In your routes.php file: Router::extensions('csv'); // In your controller's initialize() method: $this->loadComponent('RequestHandler', [ 'viewClassMap' => ['csv' => 'CsvView.Csv' ]]); // In your controller public function export() { $posts = $this->Posts->find(); $this->set(compact('posts')); if ($this->getRequest()->getParam('_ext') === 'csv') { $_serialize = 'posts'; $_header = array('Post ID', 'Title', 'Created'); $_extract = array('id', 'title', 'created'); $this->set(compact('_serialize', '_header', '_extract')); } } |
/posts/export.csvでアクセスすると、csv出力されます。
CSVをダウンロードする場合
1 2 3 4 5 6 7 8 9 10 11 12 13 |
public function export() { $data = [ ['a', 'b', 'c'], [1, 2, 3], ['you', 'and', 'me'], ]; $_serialize = 'data'; $this->response = $this->response->withDownload('my-file.csv'); $this->viewBuilder()->setClassName('CsvView.Csv'); $this->set(compact('data', '_serialize')); } |
CSV制御オプション
CSVの出力を変更するのに、以下の変数が利用できます。
変数名 デフォルト 説明
_delimiter ',' データ区切り文字
_enclosure '"' データのクオート文字
_eol "\n" データ改行文字
_newline "\n" 新規行
_bom false BOMを出力するか
_null '' データがnullの表示値
_dataEncoding 'UTF-8' データの文字コード。iconvを利用
_csvEncoding 'UTF-8' csv表示の文字コード。iconvを利用