2012-08-15 2 views
0

J'utilise fputcsv pour créer un csv mais les données qu'il délivre commencent sur la 3ème ligne quand je l'ouvre en Excel. Pourquoi est-ce?fputCSV comportement étrange

Je veux créer une rangée d'en-têtes de colonne en utilisant fputcsv, quelle est la meilleure façon de le faire.

public function indexAction() 
    { 
     $this->outputCSV(); 
     //$this->view->navigation = $navigation = Engine_Api::_()->getApi('menus', 'core')->getNavigation('passport_admin_main', array(), 'passport_admin_main_outofarea'); 
     $this->_helper->layout()->disableLayout(); 
     $this->_helper->viewRenderer->setNoRender(true); 

     header('Content-Disposition: attachment; filename="OutOfAreaReport.csv"'); 
     header('Content-type: application/excel'); 
     readfile('OutOfAreaReport.csv'); 
    } 

    public function outputCSV(){ 
     $list = array (
       array('aaa', 'saasasbbb', 'ccdddc', 'dddd') 
       ); 
     $fp = fopen('php://output', 'w'); 

     foreach ($list as $fields) { 
      fputcsv($fp, $fields); 
     } 

     fclose($fp); 
    } 
+2

Pouvez-vous ajouter le code à votre question? Avez-vous essayé d'ouvrir le fichier dans le Bloc-notes pour voir s'il est identique? – andrewsi

+0

Une bonne question devrait contenir du code puisque nous sommes tous des programmeurs. –

+0

Code ajouté à la question. – RSM

Répondre

5

Parce que vous écrivez les données à php://output, je suppose que vous offrez le fichier à télécharger?

Eh bien, les nouvelles lignes du fichier viennent plus loin de votre script, vous les avez déjà sorties.

Le coupable le plus commun ici est espace blanc avant la balise d'ouverture <?php dans votre script:

Mauvais:

 



<?php 
    // Your code here 

droit:

 
<?php 
    // Your code here 

EDIT Merci à @ SDC pour me rappeler que cela s'applique également à tous les fichiers que vous avez inclus. Pour ces fichiers, vous devrez également vous assurer qu'il n'y a pas d'espace blanc de fin après la balise de fermeture ?>, ou de préférence supprimer complètement la balise de fermeture, car il n'est pas nécessaire que le script fonctionne correctement.

+1

+1. Notez que cela s'applique aux autres fichiers PHP que vous avez inclus, ainsi qu'au fichier principal. Et vous devez également vous assurer que vous n'avez pas de lignes vides à la fin des fichiers ainsi qu'au début. – SDC

+0

@SDC Bon point sur les fichiers inclus, oublié à ce sujet, va ajouter une note dans le corps de la réponse principale. – DaveRandom

+0

Ceci fait que le CSV commence maintenant sur la ligne 2 au lieu de 3. Est-ce qu'il le réserve pour les en-têtes de colonne ou? – RSM

5

Je sais que cela a été marqué comme répondu, mais quand j'ai rencontré un problème similaire, j'avais beaucoup d'inclus, donc j'ai ajouté ob_clean; pour effacer le tampon et il a résolu le problème d'espace. Exemple:

fonction publique outputCSV() {

liste $ = array ( array ('aaa', 'saasasbbb', 'ccdddc', 'dddd') );

//add here 
ob_clean; 
$fp = fopen('php://output', 'w'); 

    foreach ($list as $fields) { 
     fputcsv($fp, $fields); 
    } 

    fclose($fp); 

}

+0

Très simple et efficace en effet! – Buzut

+0

[ob_end_clean()] (http://php.net/manual/fr/function.ob-end-clean.php) a travaillé pour moi. – inckka