PHP直接将CSV导出到浏览器

时间:2015-05-06 12:39:24

标签: php csv

我正在尝试创建CSV导出而不将文件实际保存到服务器(因此可以直接在用户浏览器中打开)。

这是我的代码。它打开Excel文件很好,但文件中只有一行(即字段行)。下方没有显示任何行。

我是否正确地循环了我的对象数组?

$fh = fopen('php://output', 'w');

    // Start output buffering (to capture stream contents)
    ob_start();

    fputcsv($fh, $fields);

    // Loop over the * to export
    if(!empty($results)) {
        foreach($results as $row) {
            fputcsv($fh, $row->week_ending);
            fputcsv($fh, $row->project);
            fputcsv($fh, $row->plots);
            fputcsv($fh, $row->categories);
            fputcsv($fh, $row->employee);
        }
    }

    // Get the contents of the output buffer
    $string = ob_get_clean();
    header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
    header("Content-type: text/csv");
    header("Content-Disposition: attachment; filename=$filename");
    exit($string);

结果:

Week ending   Project name    Plot numbers    Categories    Employee

修改

以下是对象的内容:

Array
(
    [0] => stdClass Object
        (
            [week_ending] => Sunday 10 May 2015
            [project] => Manor Road
            [plots] => 1B, 2B, 3B
            [categories] => 1" Imp Gas, 1"Imp Gas (middle flats)
            [employee] => Your Name
        )

)

2 个答案:

答案 0 :(得分:2)

fputcsv将第一个参数作为文件句柄,你有正确的。第二个参数应该是一个字段数组。所以在不知情的情况下,您应该能够做到:

foreach($results as $row) {
        fputcsv($fh, $row);
    }

答案 1 :(得分:2)

与Matt的回答一样,fputcsv期望数组作为第二个参数。看到你的每个$row都是一个对象,我们可以将它强制转换为一个数组:

<?php

// ...rest of the code... //

foreach($results as $row) {
    fputcsv($fh, (array) $row);
}

这会将$row对象转换为key => value对只是对象属性的数组。