当前位置:  开发笔记 > 编程语言 > 正文

在PHP中为用户创建CSV文件

如何解决《在PHP中为用户创建CSV文件》经验,为你挑选了7个好方法。

我在MySQL数据库中有数据.我正在向用户发送一个URL,以将其数据作为CSV文件输出.

我有电子邮件的链接,MySQL查询等.

当他们点击链接时,我怎么能弹出一个下载带有MySQL记录的CVS?

我已经掌握了获取记录的所有信息.我只是不知道如何让PHP创建CSV文件并让他们下载扩展名为.csv的文件.



1> Andrii Nemch..:
header("Content-Type: text/csv");
header("Content-Disposition: attachment; filename=file.csv");

function outputCSV($data) {
  $output = fopen("php://output", "wb");
  foreach ($data as $row)
    fputcsv($output, $row); // here you can change delimiter/enclosure
  fclose($output);
}

outputCSV(array(
  array("name 1", "age 1", "city 1"),
  array("name 2", "age 2", "city 2"),
  array("name 3", "age 3", "city 3")
));

php://输出
fputcsv


更多的人需要看到这个并投票.这是本页面上的最佳答案.PHP已经具有用于格式化CSV内容的内置函数.每个人都应该使用它们.很棒的答案,@安德里:)
很好,但`outputCSV`功能不必要地复杂化.你可以只在`$ array`上"foreach",将其值直接发送到`fputcsv`.不需要`__outputCSV`和`array_walk` :)`foreach($ data as $ vals){fputcsv($ filehandler,$ vals);}`
太糟糕的fputcsv()无法正常工作:( https://bugs.php.net/bug.php?id=50686

2> Oleg Barshay..:

尝试:

header("Content-type: text/csv");
header("Content-Disposition: attachment; filename=file.csv");
header("Pragma: no-cache");
header("Expires: 0");

echo "record1,record2,record3\n";
die;

等等

编辑:这是我用来选择编码CSV字段的代码片段:

function maybeEncodeCSVField($string) {
    if(strpos($string, ',') !== false || strpos($string, '"') !== false || strpos($string, "\n") !== false) {
        $string = '"' . str_replace('"', '""', $string) . '"';
    }
    return $string;
}


为了澄清,CSV的正确HTTP Content-Type标头是text/csv,而不是application/csv.我怀疑任何现代浏览器都会关心,但既然有标准,我们也可以使用它们.
请注意CSV的规则很重要.为了确保良好的显示效果,请在字段周围加上双引号,并且不要忘记在字段内替换双引号以加倍双引号:`echo'"'.str_replace('"','""',$ record1). ' ""'.str_replace函数....
通常,请在生成CSV文件时遵循RFC 4180.http://tools.ietf.org/html/rfc4180
@Oleg Barshay:OMG,RFC是一个主要部分:"如果双引号用于封闭字段,那么出现在字段内的双引号必须通过在其前面加上另一个双引号来转义." 另一个双引号!

3> Xeoncross..:

这是@Andrew发布的php.net函数的改进版本.

function download_csv_results($results, $name = NULL)
{
    if( ! $name)
    {
        $name = md5(uniqid() . microtime(TRUE) . mt_rand()). '.csv';
    }

    header('Content-Type: text/csv');
    header('Content-Disposition: attachment; filename='. $name);
    header('Pragma: no-cache');
    header("Expires: 0");

    $outstream = fopen("php://output", "wb");

    foreach($results as $result)
    {
        fputcsv($outstream, $result);
    }

    fclose($outstream);
}

它非常易于使用,并且适用于MySQL(i)/ PDO结果集.

download_csv_results($results, 'your_name_here.csv');

exit()如果您已完成该页面,请记住在调用此项之后.



4> Stan..:

除了已经说过的所有内容之外,您可能还需要添加:

header("Content-Transfer-Encoding: UTF-8");

在处理包含多种语言的文件(例如人名或城市)时,它非常有用.



5> 小智..:

我知道,这个帖子有点旧,但是为了将来的参考和我自己的新手:

这里的其他人都解释了如何创建CSV,但错过了问题的基本部分:如何链接.为了链接到CSV文件的下载,您只需链接到.php文件,该文件又响应为.csv文件.PHP标题就是这样做的.这可以实现很酷的东西,比如在查询字符串中添加变量并自定义输出:

Get CSV

my_csv_creator.php可以使用查询字符串中给出的变量,例如使用不同的或自定义的数据库查询,更改CSV的列,个性化文件名等,例如:

User_John_Doe_10_Dec_11.csv



6> typemismatch..:

创建您的文件,然后使用正确的标题返回对它的引用以触发另存为 - 根据需要编辑以下内容.将您的CSV数据放入$ csvdata.

$fname = 'myCSV.csv';
$fp = fopen($fname,'wb');
fwrite($fp,$csvdata);
fclose($fp);

header('Content-type: application/csv');
header("Content-Disposition: inline; filename=".$fname);
readfile($fname);



7> Justin..:

这是一个使用PDO并包含列标题的完整工作示例:

$query = $pdo->prepare('SELECT * FROM test WHERE id=?');
$query->execute(array($id));    
$results = $query->fetchAll(PDO::FETCH_ASSOC);
download_csv_results($results, 'test.csv'); 
exit();


function download_csv_results($results, $name)
{            
    header('Content-Type: text/csv');
    header('Content-Disposition: attachment; filename='. $name);
    header('Pragma: no-cache');
    header("Expires: 0");

    $outstream = fopen("php://output", "wb");    
    fputcsv($outstream, array_keys($results[0]));

    foreach($results as $result)
    {
        fputcsv($outstream, $result);
    }

    fclose($outstream);
}

推荐阅读
和谐啄木鸟
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有