使用PHP将列标题添加到CSV文件

时间:2012-02-15 17:33:07

标签: php csv

我正在尝试将php / mysql生成的表转换为可下载的csv文件。当用户输入搜索参数时,将调用mysql表并将结果作为表返回。

我使用了这个帖子中提供的解决方案并且它非常有效:Create a CSV File for a user in PHP

我能够允许用户将结果保存或查看为csv文件。我遇到的问题是我不确定如何将列标题添加到文件中。例如,返回的结果采用以下格式:$ result [x] ['office'],$ result [x] ['user']等等,但我还想添加列标题“Office”和“User”使得任何查看csv文件的人都能立即知道数据的含义。

这是生成csv文件的函数:

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

function outputCSV($data) {
        $outstream = fopen("php://output", "a");
        function __outputCSV(&$vals, $key, $filehandler) {
            fputcsv($filehandler, $vals); // add parameters if you want
        }
        array_walk($data, "__outputCSV", $outstream);
        fclose($outstream);
    }

我尝试创建以下函数,然后在调用outputCSV之前调用它,但它没有成功:

function create_file_header()
{       
    $headers = 'Office, User, Tag, Value';
    $fp = fopen("php://output", "w");
    file_put_contents("$file.csv", $headers);
    fclose($fp);
}

非常感谢任何帮助。

4 个答案:

答案 0 :(得分:10)

要创建标题,您应该只添加标题行数组并正常使用fputcsv

您不会谈论$data的格式,但如果它是关联数组,您可以为通用解决方案执行此操作:

function toCSV($data, $outstream) {
    if (count($data)) {
        // get header from keys
        fputcsv($outstream, array_keys($data[0]));
        // 
        foreach ($data as $row) {
            fputcsv($outstream, $row);
        }
    }
}

我没有看到array_walk()foreach循环的好处。

答案 1 :(得分:2)

在调用outputCSV之前执行此操作:

array_unshift($data, array('Office', 'User', 'Tag', 'Value'));

或者,如果$data的元素是关联数组,那么这将更具动态性:

array_unshift($data, array_keys($data[0]));

答案 2 :(得分:0)

难道你不能把它放在outputCSV函数中吗?

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

function outputCSV($data) {
    $outstream = fopen("php://output", "a");

    $headers = 'Office, User, Tag, Value';
    fwrite($outstream,$headers);

    function __outputCSV(&$vals, $key, $filehandler) {
        fputcsv($filehandler, $vals); // add parameters if you want
    }
    array_walk($data, "__outputCSV", $outstream);
    fclose($outstream);
 }

答案 3 :(得分:0)

$headers功能中添加可选的outputCSV参数。如果您的代码通过它们,它们将被添加到csv数组:

outputCSV($data, array('Office', 'User'));

//

function outputCSV($data, $headers = null) {
    $outstream = fopen("php://output", "a");
    function __outputCSV(&$vals, $key, $filehandler) {
        fputcsv($filehandler, $vals); // add parameters if you want
    }
    if ($headers) {
        $data = array_merge(array($headers), $data);
    }
    array_walk($data, "__outputCSV", $outstream);
    fclose($outstream);
}