CSV出力、何かと言われて実装することが多いのではないでしょうか。
FuelPHPではRESTコントローラがCSV対応しており、配列渡すだけなので久しぶりに実装しました。
と言っても良くある実装なのでsymfony2でActionで呼ばれた時の場合でご紹介します。
public function exportAction() { $header = [ 'ID', '名前', ]; $list[] = $header; //DBから呼び出した場合はgetArrayResultを使うか自分で$dataを整形して下さい。 $list[] = [1,'hoge']; $list[] = [2,'fuga']; $csv = $this->convertArrayToCsv($list); $response = $this->render( "AcmeSampleBundle::export.html.twig", [ 'csv' => $csv, ] ); //Excel対策でUTF-8からSJIS-winに変換 $contents = mb_convert_encoding($response->getContent(), 'SJIS-win', 'UTF-8'); //headerのSET $response->headers->set('Content-Type', "application/octet-stream; name=hoge.csv"); $response->headers->set('Content-Disposition', "attachment; filename=hoge.csv"); $response->setContent($contents); return $response; } //配列をCSVに変換。 //文字列のエスケープをしてくれるのでfputcsv()を利用 private function convertArrayToCsv($list) { $fp = fopen('php://temp', 'r+b'); foreach ($list as $fields) { fputcsv($fp, $fields); } rewind($fp); $tmp = str_replace(PHP_EOL, "\r\n", stream_get_contents($fp)); return $tmp; }
表示するTwig側(例ではexport.html.twig
{{ csv|raw }}
としてます。
rawを使わないとcsv内のクォートなどをエスケープするので忘れないでください。
CSVから配列にする場合のメソッドはこちらです。
0 件のコメント:
コメントを投稿