如何使 fputcsv “回显”数据

Posted

技术标签:

【中文标题】如何使 fputcsv “回显”数据【英文标题】:How to make fputcsv "echo" the data 【发布时间】:2011-06-09 05:27:04 【问题描述】:

我需要一种方法让fputscv 函数即时将数据写入浏览器,而不是创建一个临时文件,将数据保存到该文件并执行echo file_get_contents()

【问题讨论】:

【参考方案1】:

php docs 网站上找到这个,首先在函数引用下评论:

function outputCSV($data) 
  $outstream = fopen("php://output", 'w');
  function __outputCSV(&$vals, $key, $filehandler) 
    fputcsv($filehandler, $vals, ';', '"');
  
  array_walk($data, '__outputCSV', $outstream);
  fclose($outstream);

还有第二种选择:

$csv = fopen('php://temp/maxmemory:'. (5*1024*1024), 'r+');
fputcsv($csv, array('blah','blah'));
rewind($csv);

// put it all in a variable
$output = stream_get_contents($csv);

希望这会有所帮助!

顺便说一句,PHP 文档应该始终是您尝试解决问题的第一站。 :-)

【讨论】:

PHP 网站的 outputCSV() 不起作用,你有没有测试过这个? 我在 4 多年前回答了这个问题,也许有什么改变了?我不能诚实地说我是否尝试过,但我怀疑我会尝试的。随意扩展究竟是什么不起作用,而不是没有细节的空回复,也许我会进一步调查。 @VladimirGhetau 我刚刚测试了 Seb Barre 在这里发布的这个特殊的,它工作......你必须提供正确的数据 - 它希望已经将 CSV 解析为数组数组@ 987654324@ ! @SebBarre 内部函数可以只定义在外部 .... ANYWAY: 我添加了一些常量和模拟:ideone.com/giN5qW【参考方案2】:

By a comment on the PHP site

<?php
$out = fopen('php://output', 'w');
fputcsv($out, array('this','is some', 'csv "stuff", you know.'));
fclose($out);
?>

【讨论】:

写入变量:php.net/manual/en/function.fputcsv.php#74118【参考方案3】:

由于最初的提问者想要“即时写入浏览器”,也许值得注意(就像我的情况,没有人提到它)如果你想强制一个文件名和一个要求下载文件的对话框在浏览器中,您必须在使用fputcsv 输出任何内容之前设置正确的标题:

header('Content-Type: text/csv; charset=utf-8');
header('Content-Disposition: attachment; filename=myFile.csv');

【讨论】:

谢谢,这是我在将 CSV 输出到浏览器时 90% 的时间都想做的事情,您节省了我单独查找的时间。【参考方案4】:

生成 CSV 实际上并不是那么困难(解析 CSV 有点复杂)。

将二维数组写入 CSV 的示例代码:

$array = [
    [1,2,3],
    [4,5,6],
    [7,8,9]
];

// If this CSV is a HTTP response you will need to set the right content type
header("Content-Type: text/csv"); 

// If you need to force download or set a filename (you can also do this with 
// the download attribute in html5 instead)
header('Content-Disposition: attachment; filename="example.csv"')

// Column heading row, if required.
echo "Column heading 1,Column heading 2,Column heading 3\n"; 

foreach ($array as $row) 
    $row = array_map(function($cell) 
        // Cells containing a quote, a comma or a new line will need to be 
        // contained in double quotes.
        if (preg_match('/["\n,]/', $cell)) 
            // double quotes within cells need to be escaped.
            return '"' . preg_replace('/"/', '""', $cell) . '"';
        

        return $cell;
    , $row);

    echo implode(',', $row) . "\n";

【讨论】:

以上是关于如何使 fputcsv “回显”数据的主要内容,如果未能解决你的问题,请参考以下文章

获取 PHP 错误警告:fputcsv() 期望参数 2 为数组

php使用fputcsv进行大数据的导出

使用 fputcsv 从多维数组创建 CSV

fputcsv 导出excel,解决内存性能乱码科学计数法问题

php fputcsv 读取不到中文文件数据

使用 fputcsv 将 BOM 添加到 CSV 文件