In this first article of the series, we will try to create a function to export a PHP array as a CSV file, readable in Excel.
The purpose of the manipulation is to have in input data a PHP associative array and output a CSV file that will be downloaded to the user’s computer. For that, we will create the export_data_to_csv () function.
We will try to export the following PHP array
array(2) { [0]=> array(4) { ["first name"]=> string(7) "Bastien" ["last name"]=> string(10) "Malahieude" ["phone"]=> string(17) "06 XX XX XX XX XX" ["email"]=> string(28) "contact@bastienmalahieude.fr" } [1]=> array(4) { ["first name"]=> string(4) "John" ["last name"]=> string(3) "Doe" ["phone"]=> string(17) "06 XX XX XX XX XX" ["email"]=> string(11) "john@doe.fr" } }
Into a CSV file that will contain all these data :
first name | last name | phone | |
---|---|---|---|
Bastien | Malahieude | 06 XX XX XX XX XX | contact@bastienmalahieude.fr |
John | Doe | 06 XX XX XX XX XX | john@doe.fr |
Our function will take 4 arguments to make it as flexible as possible
- $data: The data table
- $delimiter: The CSV delimiter you want to use. By default ” ; To be compatible with excel
- $enclosure: The character that delimits strings. By default the quotation mark
- $filename: The name of the file you want to export
The instantiation of our function will therefore be the following:
function export_data_to_csv($data,$filename='export',$delimiter = ';',$enclosure = '"') { //@TODO Do something here }
EXPORT DATA IN CSV FORMAT
The first step is then to force the browser to consider our data as a CSV file. This is done by using the http headers sent to the client.
// Tell the browser that the data returned is a file named $filename.csv header ( "Content-disposition: attachment; filename = $ filename.csv" ); // Tell the browser that the data returned is a csv file. header ( "Content-Type: text / csv" );
WRITE TO THE FILE
Since we want to return a file, we must open a “file” in the php memory.
For that, we use the function fopen with as argument php: //output
$fp = fopen("php://output", 'w');
This tells PHP that you want to write to the memory that will be sent to the browser.
Then, for compatibility problems, the data that we export must be encoded in UTF-8
To do this, add the UTF-8 BOM to the file. More information is available here
fputs($fp, $bom =( chr(0xEF) . chr(0xBB) . chr(0xBF) ));
ADD TABLE HEADERS
Then, we want to add the keys of our table as table header of our php file.
With the help of the array_keys function , we will be able to retrieve the keys of the array.
Subsequently, the fputcsv function is used to add a line to the CSV file.
fputcsv($fp,array_keys($data[0]),$delimiter,$enclosure);
ADD PHP TABLE DATA
The next step is to add all the data of the PHP array in the CSV file. For this, we will use a foreach loop which allows to add the elements line by line:
foreach ($data as $fields) { fputcsv($fp, $fields,$delimiter,$enclosure); }
Finally, we just have to close the file and stop the script
fclose($fp); die();
Note: Since you are modifying http headers, it is important that this script be executed before any HTML code. More information on the subject is available in the PHP documentation .
FULL PHP FUNCTION
The final function we have just created is the following:
/** * * Exports an associative array into a CSV file using PHP. * * @see https://stackoverflow.com/questions/21988581/write-utf-8-characters-to-file-with-fputcsv-in-php * * @param array $data The table you want to export in CSV * @param string $filename The name of the file you want to export * @param string $delimiter The CSV delimiter you wish to use. The default ";" is used for a compatibility with microsoft excel * @param string $enclosure The type of enclosure used in the CSV file, by default it will be a quote " */ function export_data_to_csv($data,$filename='export',$delimiter = ';',$enclosure = '"') { // Tells to the browser that a file is returned, with its name : $filename.csv header("Content-disposition: attachment; filename=$filename.csv"); // Tells to the browser that the content is a csv file header("Content-Type: text/csv"); // I open PHP memory as a file $fp = fopen("php://output", 'w'); // Insert the UTF-8 BOM in the file fputs($fp, $bom =( chr(0xEF) . chr(0xBB) . chr(0xBF) )); // I add the array keys as CSV headers fputcsv($fp,array_keys($data[0]),$delimiter,$enclosure); // Add all the data in the file foreach ($data as $fields) { fputcsv($fp, $fields,$delimiter,$enclosure); } // Close the file fclose($fp); // Stop the script die(); }
The code is available on github in the repository xusifob/lib
Feel free to comment this article using the form underneath!
salut, je n’arrive pas à upload le fichier. aucun de mes browsers ne me propose de récupérer le fichier. je passe par un event (click) sur un bouton qui renvoi le traitement ci-dessus par un appel en ajax. je récupère bien les données de ma bdd: ajax renvoi bien le contenu sous une forme csv comme attendu. mais je n’ai pas accès à l’upload. pas de popup….. Je ne vois pas de html avant dans mon code…. Dans les En-têtes de la réponse : Connection: Keep-Alive Content-disposition attachment; filename=export.csv Content-Length 332 Content-Type text/csv;charset=UTF-8 Date Mon, 23 Sep 2019 14:34:12 GMT… Lire la suite »
Bonjour,
En effet, le téléchargement via Ajax n’est pas possible, si tu souhaites pouvoir le faire télécharger à l’utilisateur via un clic par exemple, il faut se rendre sur la page qui génère le fichier CSV via un lien direct vers cette page par exemple
Ok, merci pour l’astuce.
J’ai trouvé une toute autre solution dans mon cas.
En effet, je n’ai même pas pensé à le faire comme tu le dit car j’ai trop pris l’habitude de travailler via les events en ajax maintenant.
Bonjour, d’abord merci pour le tuto très intéressant et complet, j’en suis fan après avoir essuyer pas mal d’échec. J’aimerais savoir Ghibu qu’elle a été ta solution pour le téléchargement stp?
Bonjour, merci pour ce tutoriel, j’ai un soucis à la fin: rien ne se passe si je lance la fonction avec un bouton onclick ou si je fait un href vers php://output. Possible d’avoir de l’aide pour le téléchargement svp?
Tu peux essayer de voir le code ci-dessous, qui devrait fonctionner :
https://phpfiddle.tk/96a23230
Bonjour, tout d’abord merci pour ce tutorial.
J’ai un soucis dans la génération de mon excel, car à la suite des ligne csv il affiche mes données en format php (array, variable)
Quelqu’un pourrais m’aider ?
Bonjour Clément,
N’as tu pas laissé un var_dump() quelque part dans ton code ?
Ou alors le problème peut venir si ton tableau n’est pas sous le bon format, alors il peut générer des erreurs PHP