Как создать и скачать csv файл из php скрипта?


Я начинающий программист, и я искал много о моем вопросе, но не мог найти полезное решение или учебник об этом.

моя цель-у меня есть PHP массив и элементы массива отображаются в списке на странице.

Я хочу добавить опцию, так что если пользователь хочет, он может создать CSV-файл с элементами массива и скачать ее.

Я не знаю, как это делать. Я тоже много искал. Но все же, чтобы найти какие-либо полезные ресурс.

пожалуйста, предоставьте мне какой-нибудь учебник или решение или совет, чтобы реализовать его самостоятельно. Поскольку я новичок, пожалуйста, предоставьте простые в реализации решения.

мой массив выглядит так:

Array
(
    [0] => Array
        (
            [fs_id] => 4c524d8abfc6ef3b201f489c
            [name] => restaurant
            [lat] => 40.702692
            [lng] => -74.012869
            [address] => new york
            [postalCode] => 
            [city] => NEW YORK
            [state] => ny
            [business_type] => BBQ Joint
            [url] => 
        )

)
5 61

5 ответов:

вы можете использовать встроенный в fputcsv() чтобы ваши массивы генерировали правильные строки csv из вашего массива, поэтому вам придется перебирать и собирать строки. например:

$f = fopen("tmp.csv", "w");
foreach ($array as $line) {
    fputcsv($f, $line)
}

чтобы браузеры предлагали диалог" Сохранить как", вам нужно будет отправить HTTP-заголовки следующим образом (см. подробнее об этом заголовке в rfc):

header('Content-Disposition: attachment; filename="filename.csv";');

складывая все это вместе:

function array_to_csv_download($array, $filename = "export.csv", $delimiter=";") {
    // open raw memory as file so no temp files needed, you might run out of memory though
    $f = fopen('php://memory', 'w'); 
    // loop over the input array
    foreach ($array as $line) { 
        // generate csv lines from the inner arrays
        fputcsv($f, $line, $delimiter); 
    }
    // reset the file pointer to the start of the file
    fseek($f, 0);
    // tell the browser it's going to be a csv file
    header('Content-Type: application/csv');
    // tell the browser we want to save it instead of displaying it
    header('Content-Disposition: attachment; filename="'.$filename.'";');
    // make php send the generated csv lines to the browser
    fpassthru($f);
}

и вы можете использовать его как это:

array_to_csv_download(array(
  array(1,2,3,4), // this array is going to be the first row
  array(1,2,3,4)), // this array is going to be the second row
  "numbers.csv"
);

обновление:
Вместо php://memory вы также можете использовать php://output для дескриптора файла и покончить с поиске и такой:

function array_to_csv_download($array, $filename = "export.csv", $delimiter=";") {
    header('Content-Type: application/csv');
    header('Content-Disposition: attachment; filename="'.$filename.'";');

    // open the "output" stream
    // see http://www.php.net/manual/en/wrappers.php.php#refsect2-wrappers.php-unknown-unknown-unknown-descriptioq
    $f = fopen('php://output', 'w');

    foreach ($array as $line) {
        fputcsv($f, $line, $delimiter);
    }
}   

у меня недостаточно репутации, чтобы ответить на решение @complex857. Он отлично работает, но мне пришлось добавить ; в конце заголовка Content-Disposition имеет. Без него браузер добавляет два тире в конце имени файла (например, вместо "экспорт.csv "файл сохраняется как" экспорт.csv--"). Вероятно, он пытается санировать \r\n в конце строки заголовка.

правильная строка должна выглядеть так:

header('Content-Disposition: attachment;filename="'.$filename.'";');

в случае, когда CSV имеет UTF-8 символов в нем, вы должны изменить кодировка в UTF-8 путем изменения типа содержимого строки:

header('Content-Type: application/csv; charset=UTF-8');

кроме того, я считаю более элегантным использовать rewind() вместо fseek():

rewind($f);

Спасибо за ваше решение!

Try...
csv download.
<?php 
mysql_connect('hostname', 'username', 'password');
mysql_select_db('dbname');
$qry = mysql_query("SELECT * FROM tablename");
$data = "";
while($row = mysql_fetch_array($qry)) {
  $data .= $row['field1'].",".$row['field2'].",".$row['field3'].",".$row['field4']."\n";
}

header('Content-Type: application/csv');
header('Content-Disposition: attachment; filename="filename.csv"');
echo $data; exit();
?>

используйте приведенный ниже код для преобразования массива php в CSV

<?php
   $ROW=db_export_data();//Will return a php array
   header("Content-type: application/csv");
   header("Content-Disposition: attachment; filename=test.csv");
   $fp = fopen('php://output', 'w');

   foreach ($ROW as $row) {
        fputcsv($fp, $row);
   }
   fclose($fp);

если структура массива всегда будет многомерной именно таким образом, то мы можем перебирать элементы следующим образом:

$fh = fopen('somefile.csv', 'w') or die('Cannot open the file');

for( $i=0; $i<count($arr); $i++ ){
    $str = implode( ',', $arr[$i] );
    fwrite( $fh, $str );
    fwrite( $fh, "\n" );
}
fclose($fh);

Это один из способов сделать это ... вы можете сделать это вручную, но этот способ быстрее и легче понять и прочитать.

тогда вы бы управлять заголовками что-то, что complex857 делает, чтобы выплюнуть файл. Затем вы можете удалить файл с помощью unlink () если вы больше не нужны, или вы могли бы оставьте его на сервере, если хотите.