Blogdevphp

Symfony2 : Exporter des données dans un fichier sous format CSV

2014-10-04 symfony

Exporter des données, issu d'une base de données, est une des tâches les plus récurrentes d'un développeur. L'attention, est de mise lorsque la masse de données, est assez importante.

Sous Symfony, on utilise généralement Doctrine, pour intéragir, avec la base de données pour sélectionner, mettre à jour ou supprimer. Cependant, lors d'import ou d'export d'une grosse masse de données, utiliser Doctrine est déconseillé dans ce genre de traitements.

Ici, nous allons voir comment exporter des données, en récupérant les informations d'une base de données dans un fichier CSV.

Mise en place

On ne va pas utiliser un ORM car il va opérer en récupérant, toutes les lignes, avant d'effectuer l'export. Pour optimiser l'export, on va utiliser la classe StreamedResponse qui va générer le fichier au fur et à mesure.

De plus, le fichier ne sera pas enregistré dans un quelconque dossier.

Pour commencer, on va déclarer notre classe StreamedResponse, en début de fichier comme ceci :

<?php

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\StreamedResponse;

?>

 

Par la suite, créons la fonction qui va générer notre fichier CSV à la volée :

<?php

public function generateCsvAction(){

  //Connexion à la base de données avec le service database_connection
  $conn = $this->get('database_connection');
  
  //Requête
  $results = $conn->query( "Votre requête" );
  
  $response = new StreamedResponse();
  $response->setCallback(function() use($results){
  
    $handle = fopen('php://output', 'w+');
     // Nom des colonnes du CSV 
    fputcsv($handle, array('Nom Produit',
                             'Désignation',
                             'Marque',
                             'Modele'
            ),';');
            
    //Champs
    while( $row = $results->fetch() ) 
       {
       
            fputcsv($handle,array($row['nom_produit'],
                                  $row['designation'],
                                  $row['marque'],
                                  $row['modele']
                   ),';');
       
       }
       
    fclose($handle);
  }
  
  
   $response->setStatusCode(200);
   $response->headers->set('Content-Type', 'text/csv; charset=utf-8');
   $response->headers->set('Content-Disposition','attachment; filename="export.csv"');
      
   return $response;                             
       


}

?>

Pour la connexion à la base de données, on a utilisé le service database_connexion pour initialiser l'accès à la base de données. Par la suite, on effectue notre requête avec les possibles jointures. Puis on instancie la classe StreamedResponse et on va récupérer le contenu avec le callback.

En sortie, on va générer le fichier sans avoir à le sauvegarder, on peut créer des colonnes pour le CSV en utilisant la fonction fputcsv() pour le formatage des données au format CSV. Enfin remplir le fichier avec le résultat de la requête ainsi saisie.

 

Ce script pour générer un CSV permettra d'éviter les problèmes de mémoire et un gain de temps pour l'utilisateur.

comments powered by Disqus
Copyright © 2016 blogdevphp.fr - Tous droits réservés