122 votes

Comment créer et télécharger un fichier csv à partir de php script ?

Je suis un programmeur débutant et j'ai beaucoup cherché à propos de ma question mais je n'ai pas trouvé de solution ou de tutoriel utile à ce sujet.

Mon but est d'avoir un tableau PHP et les éléments du tableau sont affichés dans une liste sur la page.

Je veux ajouter une option, pour que si un utilisateur le souhaite, il puisse créer un fichier CSV avec des éléments de tableau et le télécharger.

Je ne sais pas comment faire. J'ai aussi beaucoup cherché. Mais je n'ai pas encore trouvé de ressource utile.

Veuillez me fournir un tutoriel, une solution ou un conseil pour le mettre en œuvre moi-même. Comme je suis un novice, veuillez me fournir des solutions faciles à mettre en œuvre.

Mon tableau ressemble à ça :

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] => 
        )

)

254voto

complex857 Points 16859

Vous pouvez utiliser la fonction intégrée fputcsv() pour vos tableaux afin de générer des lignes csv correctes à partir de votre tableau, vous devrez donc boucler et collecter les lignes, comme ceci :

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

Pour que les navigateurs proposent la boîte de dialogue "Enregistrer sous", vous devrez envoyer des en-têtes HTTP comme celui-ci (pour plus d'informations sur cet en-tête, voir le document rfc ) :

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

Tout mettre en place :

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: text/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);
}

Et vous pouvez l'utiliser comme ça :

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"
);

Mise à jour :
Au lieu de la php://memory vous pouvez également utiliser le php://output pour le descripteur de fichier et supprimer la recherche et autres :

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);
    }
}

21voto

Luxian Points 71

Je n'ai pas assez de réputation pour répondre à la solution de @complex857. Elle fonctionne très bien, mais j'ai dû ajouter ; à la fin de l'en-tête Content-Disposition. Sans cela, le navigateur ajoute deux tirets à la fin du nom du fichier (par exemple, au lieu de "export.csv", le fichier est enregistré sous "export.csv--"). Il essaie probablement d'assainir \r\n à la fin de la ligne d'en-tête.

La ligne correcte devrait ressembler à ceci :

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

Dans le cas où le CSV contient des caractères UTF-8, vous devez changer l'encodage en UTF-8 en modifiant la ligne Content-Type :

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

De même, je trouve plus élégant d'utiliser rewind() au lieu de fseek() :

rewind($f);

Merci pour votre solution !

21voto

Sajidur Rahman Points 31

C'est la fonction que j'ai utilisée pour mon projet, et elle fonctionne comme prévu.

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

    // clean output buffer
    ob_end_clean();

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

    // use keys as column titles
    fputcsv( $handle, array_keys( $array['0'] ), $delimiter );

    foreach ( $array as $value ) {
        fputcsv( $handle, $value, $delimiter );
    }

    fclose( $handle );

    // flush buffer
    ob_flush();

    // use exit to get rid of unexpected output afterward
    exit();
}

18voto

Indrajeet Singh Points 604

Essayez... Télécharger csv.

<?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();
?>

9voto

Kiran Reddy Points 1

Utilisez le code ci-dessous pour convertir un tableau php en 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);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X