Как создать и скачать 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 ответов:
вы можете использовать встроенный в 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 () если вы больше не нужны, или вы могли бы оставьте его на сервере, если хотите.