我目前正在测试通过 webapp 生成的报告的新导出到 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 时,我的浏览器并没有显示文件打开/保存对话框,而是在网页上显示原始报告内容。
我使用 Firefox 的“Live HTTP Headers”插件检查了 HTTP 标头,发现对于较大的数据集,标头设置不正确并显示为“text/html”;charset=utf-8' 而不是 'application/vnd.ms-excel'。很奇怪。