web-dev-qa-db-ja.com

PHPでCSVファイルを作成する

Csvファイルを作成したいのですが、コードを実行すると、空のページが返され、csvファイルは返されません。 PHP 5を使用します。次のコードを使用します。

<?php
    $data = array ('aaa,bbb,ccc,dddd',
                   '123,456,789',
                   '"aaa","bbb"');

    $fp = fopen('data.csv', 'w');
    foreach($data as $line){
             $val = explode(",",$line);
             fputcsv($fp, $val);
    }
    fclose($fp);
?>

ありがとうございました!

42
andrei.godea

fileに書き込みを行っているため空白です。代わりにphp://outputを使用してoutputに書き込み、ヘッダー情報を送信してcsvであることを示す必要があります。

header('Content-Type: text/csv');
header('Content-Disposition: attachment; filename="sample.csv"');
$data = array(
        'aaa,bbb,ccc,dddd',
        '123,456,789',
        '"aaa","bbb"'
);

$fp = fopen('php://output', 'wb');
foreach ( $data as $line ) {
    $val = explode(",", $line);
    fputcsv($fp, $val);
}
fclose($fp);
92
Baba

@Babaの答えは素晴らしい。しかし、 explode はパラメーターとして配列を取るため、fputcsvを使用する必要はありません。

たとえば、3列、4行のドキュメントがある場合、よりストレートなバージョンがあります。

header('Content-Type: text/csv');
header('Content-Disposition: attachment; filename="sample.csv"');

$user_CSV[0] = array('first_name', 'last_name', 'age');

// very simple to increment with i++ if looping through a database result 
$user_CSV[1] = array('Quentin', 'Del Viento', 34);
$user_CSV[2] = array('Antoine', 'Del Torro', 55);
$user_CSV[3] = array('Arthur', 'Vincente', 15);

$fp = fopen('php://output', 'wb');
foreach ($user_CSV as $line) {
    // though CSV stands for "comma separated value"
    // in many countries (including France) separator is ";"
    fputcsv($fp, $line, ',');
}
fclose($fp);
45
Buzut