現在、Web アプリケーション経由で生成されたレポートの CSV への新しいエクスポート機能をテストしています。関連するコードは次のようになります。
$my_report_data = ReportDAO::runCampaignAnalysis($campaign_id, $start_date, $end_date);
$this->getResponse()->clearHttpHeaders();
$this->getResponse()->setHttpHeader('Content-Type', 'application/vnd.ms-excel');
$this->getResponse()->setHttpHeader('Content-Disposition', 'attachment; filename='export.csv');
$outstream = fopen("php://output", "w");
function __outputCSV(&$vals, $key, $filehandler) {
$retval = fputcsv($filehandler, $tempArray);
if($retval == FALSE) {
error_log('Uh oh, spaghetti o!');
error_log('The current line being processed is: ' . join('|', $vals));
}
}
array_walk($my_report_data, "__outputCSV", $outstream);
fclose($outstream);
return sfView::HEADER_ONLY;
$my_report_data は、ここで見られる形式の単なる多次元配列です。
このコードは、たとえば 100 行以下の小さなデータセットで完全に機能します (残念ながら、カットオフがどこにあるかはよくわかりません)。より大きなデータセットを使用。ただし、CSV にエクスポートしようとすると、ブラウザーで [ファイルを開く/保存] ダイアログが表示されるのではなく、生のレポートの内容が Web ページに表示されます。
Firefox の「ライブ HTTP ヘッダー」プラグインを使用して HTTP ヘッダーを調べたところ、大きなデータセットではヘッダーが適切に設定されておらず、「text/html;」として表示されることがわかりました。「application/vnd.ms-excel」ではなく「charset=utf-8」。非常に奇妙です。