it-swarm.com.de

Wie erstelle und lade ich eine CSV-Datei aus einem PHP-Skript herunter?

Ich bin ein unerfahrener Programmierer und habe viel nach meiner Frage gesucht, aber keine hilfreiche Lösung oder Anleitung dazu gefunden.

Mein Ziel ist es, ein Array PHP und die Array-Elemente werden in einer Liste auf der Seite angezeigt.

Ich möchte eine Option hinzufügen, damit ein Benutzer eine CSV-Datei mit Array-Elementen erstellen und herunterladen kann, wenn er dies wünscht.

Ich weiß nicht, wie ich das machen soll. Ich habe auch viel gesucht. Aber noch keine hilfreiche Ressource zu finden.

Bitte geben Sie mir ein Tutorial oder eine Lösung oder einen Rat, um es selbst zu implementieren. Als Anfänger geben Sie bitte einfach zu implementierende Lösungen an.

Mein Array sieht folgendermaßen aus:

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

Sie können das eingebaute fputcsv () für Ihre Arrays verwenden, um korrekte CSV-Zeilen aus Ihrem Array zu generieren. Sie müssen also eine Schleife durchlaufen und die Zeilen sammeln. mögen:

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

Damit die Browser den Dialog "Speichern unter" anbieten, müssen Sie HTTP-Header wie folgt senden (weitere Informationen zu diesem Header finden Sie im rfc ):

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

Alles zusammenfassen:

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

Und du kannst es so benutzen:

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

Update:
Anstatt des php://memory Sie können auch die php://output für den Dateideskriptor und beseitigen die Suche und solche:

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

Ich habe nicht genug Ruf, um auf die @ complex857-Lösung zu antworten. Es funktioniert großartig, aber ich musste hinzufügen; am Ende des Content-Disposition-Headers. Ohne diese Angabe fügt der Browser am Ende des Dateinamens zwei Bindestriche ein (z. B. wird die Datei anstelle von "export.csv" als "export.csv--" gespeichert). Möglicherweise wird versucht,\r\n am Ende der Kopfzeile zu bereinigen.

Die richtige Zeile sollte folgendermaßen aussehen:

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

Wenn in CSV UTF-8-Zeichen enthalten sind, müssen Sie die Codierung in UTF-8 ändern, indem Sie die Zeile Content-Type ändern:

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

Ich finde es auch eleganter, rewind () anstelle von fseek () zu verwenden:

rewind($f);

Danke für deine Lösung!

14
Luxian

Versuchen Sie ... 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();
?>
10
Indrajeet Singh

Verwenden Sie den folgenden Code, um ein PHP-Array in CSV zu konvertieren

<?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

Das ist die Funktion, die ich für mein Projekt verwendet habe und die wie erwartet funktioniert.

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

Wenn Ihre Array-Struktur genau so immer mehrdimensional sein wird, können wir die folgenden Elemente durchlaufen:

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

Das ist eine Möglichkeit, es zu tun ... Sie können es manuell tun, aber diese Möglichkeit ist schneller und einfacher zu verstehen und zu lesen.

Dann würden Sie in Ihren Headern etwas verwalten, was complex857 tut, um die Datei auszuspucken. Sie können die Datei dann mit nlink () löschen, wenn Sie sie nicht mehr benötigen, oder Sie können sie auf dem Server lassen, wenn Sie dies wünschen.

3
half-fast