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 件のコメント:
コメントを投稿