Saltar al contenido

¿Cómo crear y descargar un archivo csv desde un script php?

Solución:

Puede usar el fputcsv () incorporado para que sus matrices generen líneas csv correctas a partir de su matriz, por lo que tendrá que recorrer y recopilar las líneas, así:

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

Para que los navegadores ofrezcan el cuadro de diálogo “Guardar como”, tendrá que enviar encabezados HTTP como este (vea más sobre este encabezado en el rfc):

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

Poniendolo todo junto:

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

Y puedes usarlo así:

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

Actualizar:

En vez de php://memory también puedes usar el php://output para el descriptor de archivo y elimine la búsqueda y tal:

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

No tengo suficiente reputación para responder a la solución @ complex857. Funciona muy bien, pero tuve que agregar; al final del encabezado Content-Disposition. Sin él, el navegador agrega dos guiones al final del nombre del archivo (por ejemplo, en lugar de “export.csv”, el archivo se guarda como “export.csv–“). Probablemente intente desinfectar r n al final de la línea del encabezado.

La línea correcta debería verse así:

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

En caso de que CSV tenga caracteres UTF-8, debe cambiar la codificación a UTF-8 cambiando la línea Content-Type:

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

Además, me parece más elegante usar rewind () en lugar de fseek ():

rewind($f);

¡Gracias por tu solución!

Intente … descargar 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();
?>
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *