0

我目前正在测试通过 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'。很奇怪。

4

2 回答 2

1

奇怪:您可能想尝试定期刷新输出缓冲区。我发现我需要这样做以防止类似的错误。类似于以下内容:

if($len > 250){ $len = 0; if(ob_get_length()) ob_flush(); }

哪里$len是行数。将其放入您的中很麻烦array_walk,但这可能会有所帮助。

于 2012-04-19T14:44:12.000 回答
0

我相信我已经找到了一个可能的解决方案。不完全确定它为什么起作用;但确实如此。我只是在调用 clearHttpHeaders 之前添加了以下内容:

ob_start('ob_gzhandler');

像魅力一样工作。

于 2012-04-19T15:45:23.707 回答