【问题标题】:Direcly outputting to a CSV from an array without saving to a CSV file从数组直接输出到 CSV 而不保存到 CSV 文件
【发布时间】:2012-05-23 07:34:15
【问题描述】:

我正在寻找一种简单的方法来获取数组,将其转换为 CSV,并让用户能够下载 CSV,而无需将 CSV 保存到服务器。

【问题讨论】:

  • 有什么特殊原因无法保存到服务器吗?
  • this 怎么样 - 虽然不是 php

标签: php arrays file csv


【解决方案1】:
$array = [
    ['name', 'email'],
    ['Doe, John', 'johndoe@foo'],
    ['Jane Doe', 'janedoe@foo'],
    ['Ron "SuperFly" O\'Neal', 'supafly@foo'],

];
header("Content-type: application/csv");
header("Content-Disposition: attachment; filename=test.csv");
$fp = fopen('php://output', 'w');
foreach ($array as $row) {
    fputcsv($fp, $row);
}

fputcsv()

使用fputcsv 的好处是它将为您处理字段的转义和封闭,确保有效、可靠的输出即使您的列值碰巧包含 csv 控制字符(如如逗号、引号、换行符等...如果您不注意稳健地处理控制字符,而是采用通用快捷方式,例如使用implode(',', $row),您的(低质量)代码将产生损坏的 csv 输出。

不幸的是,fputcsv 不能输出到字符串,只能输出到流,所以我写到 php 的输出流,相当于echo'ing it out。如果您需要在输出之前将 csv 文件内容作为字符串访问,您也可以写入php://memoryphp://temp 或文件。

$fp = fopen('php://temp', 'w+'); // or fopen('myfile.csv', 'w+');
foreach ($array as $row) {
    fputcsv($fp, $row);
}

// Read it back into a string, if desired.
// Rewind the stream to start.
fseek($fp, 0);
// Read the entire stream.
$str = stream_get_contents($fp);

包装信息http://www.php.net/manual/en/wrappers.php.php

【讨论】:

    【解决方案2】:
    header("Content-type: application/csv");
    header("Content-Disposition: attachment; filename=test.csv");
    header("Pragma: no-cache");
    header("Expires: 0");
    
    echo "name,city,street\n";
    

    有时候用起来会更好

    header("Content-Type: application/octet-stream");
    

    对于 IE...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-08-07
      • 1970-01-01
      • 1970-01-01
      • 2010-12-03
      • 2022-12-23
      • 2016-11-04
      • 2016-08-25
      相关资源
      最近更新 更多