web-dev-qa-db-fra.com

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

Je suis un programmeur débutant et j’ai beaucoup cherché ma question, mais j’ai trouvé une solution ou un tutoriel utile à ce sujet.

Mon objectif est que j'ai un tableau PHP et que les éléments du tableau apparaissent dans une liste sur la page.

Je souhaite ajouter une option afin 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 ça. J'ai aussi beaucoup cherché. Mais pas encore trouvé de ressource utile.

Veuillez me fournir un tutoriel ou une solution ou un conseil pour le mettre en œuvre moi-même. En tant que novice, merci de fournir des solutions faciles à mettre en œuvre.

Mon tableau ressemble à:

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

)
79
user2302780

Vous pouvez utiliser le paramètre fputcsv () intégré pour que vos tableaux génèrent les lignes csv correctes à partir de votre tableau. Vous devrez donc effectuer une boucle et collecter les lignes. comme:

_$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 les en-têtes HTTP comme ceci (pour en savoir plus sur cet en-tête dans le rfc ):

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

Mettre tous ensemble:

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

Et vous pouvez l'utiliser comme ceci:

_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 du _php://memory_, vous pouvez également utiliser le php://output pour le descripteur de fichier et supprimer la recherche, par exemple:

_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);
    }
}   
_
175
complex857

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

La ligne correcte devrait ressembler à ceci:

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

Si CSV contient des caractères UTF-8, vous devez modifier le codage en UTF-8 en modifiant la ligne Content-Type:

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

Aussi, je trouve plus élégant d'utiliser rewind () au lieu de fseek ():

rewind($f);

Merci pour votre solution!

14
Luxian

Essayez ... téléchargement 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();
?>
10
Indrajeet Singh

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);
7
Kiran Reddy

C’est la fonction que j’ai utilisée pour mon projet et qui 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'] ) );

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

    fclose( $handle );

    // flush buffer
    ob_flush();

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

Si votre structure de tableau sera toujours multi-dimensionnelle de cette manière, nous pouvons parcourir les éléments tels que:

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

C'est une façon de le faire ... vous pouvez le faire manuellement, mais cette méthode est plus rapide et plus facile à comprendre et à lire.

Ensuite, vous allez gérer vos en-têtes avec ce que complex857 fait pour cracher le fichier. Vous pouvez ensuite supprimer le fichier en utilisant nlink () si vous n'en avez plus besoin, ou vous pouvez le laisser sur le serveur si vous le souhaitez.

3
half-fast