Crearea unui fișier csv cu php (Programare, Php, Csv)

andrei.godea a intrebat.

Vreau să creez un fișier csv, dar când execut codul, acesta returnează o pagină goală și nici un fișier csv. Folosesc PHP 5.Folosesc următorul cod:

<?php
    $data = array ('aaa,bbb,ccc,dddd',
                   '123,456,789',
                   '"aaa","bbb"');

    $fp = fopen('data.csv', 'w');
    foreach($data as $line){
             $val = explode(",",$line);
             fputcsv($fp, $val);
    }
    fclose($fp);
?>

Vă mulțumesc!

Comentarii

  • Trebuie să echo ieșirea după fclose($fp); –  > Por Funk Forty Niner.
  • Tu nu ești echoing nimic, astfel încât pagina va fi doar goală. Se va crea doar csv pentru tine conform codului tău. –  > Por Rikesh.
3 răspunsuri
Baba

Este gol pentru că scrieți la file. ar trebui să scrieți la output folosind php://output în schimb și, de asemenea, trimiteți informații de antet pentru a indica faptul că este csv.

Exemplu

header('Content-Type: text/csv');
header('Content-Disposition: attachment; filename="sample.csv"');
$data = array(
        'aaa,bbb,ccc,dddd',
        '123,456,789',
        '"aaa","bbb"'
);

$fp = fopen('php://output', 'wb');
foreach ( $data as $line ) {
    $val = explode(",", $line);
    fputcsv($fp, $val);
}
fclose($fp);

Comentarii

  • Pot să știu cum se poate da calea foii Excel existente pentru acest lucru? –  > Por asha.
  • Am avut probleme în a pune header() după fputcsv() și odată ce le-am mutat deasupra fputcsv(), am încetat să mai am probleme. –  > Por Howdy_McGee.
Buzut

Răspunsul lui @Baba este excelent. Dar nu trebuie să folosiți explode deoarece fputcsv primește ca parametru o matrice

De exemplu, dacă ai un document cu trei coloane și patru rânduri, iată o variantă mai directă:

header('Content-Type: text/csv');
header('Content-Disposition: attachment; filename="sample.csv"');

$user_CSV[0] = array('first_name', 'last_name', 'age');

// very simple to increment with i++ if looping through a database result 
$user_CSV[1] = array('Quentin', 'Del Viento', 34);
$user_CSV[2] = array('Antoine', 'Del Torro', 55);
$user_CSV[3] = array('Arthur', 'Vincente', 15);

$fp = fopen('php://output', 'wb');
foreach ($user_CSV as $line) {
    // though CSV stands for "comma separated value"
    // in many countries (including France) separator is ";"
    fputcsv($fp, $line, ',');
}
fclose($fp);

Comentarii

  • Categoric, asta ar trebui să funcționeze și chiar ar putea fi mai potrivită. Mai multe detalii aici –  > Por Buzut.
Channaveer Hakari

Doar în cazul în care cineva se întreabă dacă dorește să salveze fișierul CSV într-o anumită cale pentru atașamente de e-mail. Atunci se poate face după cum urmează

Știu că am adăugat o mulțime de comentarii doar pentru începători 🙂

Am adăugat un exemplu, astfel încât să puteți rezuma bine.

$activeUsers = /** Query to get the active users */

/** Following is the Variable to store the Users data as 
    CSV string with newline character delimiter, 

    its good idea of check the delimiter based on operating system */

$userCSVData = "Name,Email,CreatedAt
";

/** Looping the users and appending to my earlier csv data variable */
foreach ( $activeUsers as $user ) {
    $userCSVData .= $user->name. "," . $user->email. "," . $user->created_at."
";
}
/** Here you can use with H:i:s too. But I really dont care of my old file  */
$todayDate  = date('Y-m-d');
/** Create Filname and Path to Store */
$fileName   = 'Active Users '.$todayDate.'.csv';
$filePath   = public_path('uploads/'.$fileName); //I am using laravel helper, in case if your not using laravel then just add absolute or relative path as per your requirements and path to store the file

/** Just in case if I run the script multiple time 
    I want to remove the old file and add new file.

    And before deleting the file from the location I am making sure it exists */
if(file_exists($filePath)){
    unlink($filePath);
}
$fp = fopen($filePath, 'w+');
fwrite($fp, $userCSVData); /** Once the data is written it will be saved in the path given */
fclose($fp);

/** Now you can send email with attachments from the $filePath */

NOTĂ: Ceea ce urmează este o idee foarte proastă pentru a mări memory_limit și limita de timp, dar am adăugat doar pentru a mă asigura dacă cineva se confruntă cu problema timpului de conectare sau cu orice altă problemă. Asigurați-vă că găsiți o alternativă înainte de a vă lipi de ea.

Trebuie să adăugați următoarele la începutul scriptului de mai sus.

ini_set("memory_limit", "10056M");
set_time_limit(0);
ini_set('mysql.connect_timeout', '0');
ini_set('max_execution_time', '0');

Tags:,