Générer 1 fichier csv et le télécharger

Réduire
X
 
  • Filtrer
  • Heure
  • Afficher
Tout effacer
nouveaux messages

  • Générer 1 fichier csv et le télécharger

    Bonjour,

    Je coinçe sur la rédaction d'un script en php qui doit, à partir d'une variable tableau unidimensionnel déjà rempli, me générer un fichier CSV puis me le técharger (pour intégration ensuite dans Excel).
    J'ai déjà passé de nombreuses heures à ferrailler, et j'ai tenté d'appliquer des modèles trouvés sur la toile: rien n'y fait. Tous les résultats me donnent:
    • soit un fichier vide,
    • soit la copie de mon fichier "index.php" !
    Voici le script que je tente d'utiliser sans succès. Sauf erreur, c'est la conversion d'un élément de ma variable tableau en données CSV qui foire ... et je télécharge un fichier vide !

    Code PHP:

    // la variable de type array() est $pass, elle contient mes lignes de données (chaque ligne n'ayant qu'une seule donnée NOM
    $fp fopen('test.csv''w');
    foreach(
    $pass as $fields) {
    fputcsv($fp$fields';');
    }

    fclose($fp);
    $fichier "test.csv";
    $chemin="./test.csv";
    header('Content-disposition: attachment; filename="' $fichier '"');
    header('Content-Type: text/csv');
    header('Content-Transfer-Encoding: binary');
    header('Content-Length: 'filesize($chemin));
    header('Pragma: no-cache');
    header('Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0');
    header('Expires: 0'); 
    Je pense mal utiliser la fonction de conversion "fputcsv()".

    Grand merci pour vos conseils éclairés.

    nb: j'ai bien testé le contenu de $pass, et le téléchargement fonctionne parfaitement

  • #2
    Bonjour,

    Si ce que vous souhaitez afficher/télécharger dans un fichier CSV provient des tables Joomla (articles, utilisateurs, ...), vous pouvez utiliser ce super script de cavo789 :

    Extract informations from your Joomla database and display them in a raw table; allowing to quickly connect that table into a spreadsheet program (like MS Excel) - cavo789/joomla_show_table
    Présentations : slides.woluweb.be | Coordonnées complètes : www.woluweb.be

    Un message d’erreur sur votre site Joomla... ayez le reflexe de consulter la base de connaissance : https://kb.joomla.fr

    Ce forum, vous l'aimez ? Il vous a sauvé la vie ? Vous y apprenez régulièrement ? Alors adhérer à l'AFUJ, l'Association Francophone des Utilisateurs de Joomla : https://www.joomla.fr/association/adherer

    Commentaire


    • #3
      Envoyé par woluweb Voir le message
      Bonjour,

      Si ce que vous souhaitez afficher/télécharger dans un fichier CSV provient des tables Joomla (articles, utilisateurs, ...), vous pouvez utiliser ce super script de cavo789 :

      https://github.com/cavo789/joomla_show_table
      Mon souci ne réside pas dans l'extraction de données de ma BDD. Ma variable tableau possède déjà les données dont j'ai besoin.

      Commentaire


      • #4
        Ne trouvant pas de solution qui me convienne, je viens de créer mon fichier csv tout comme un fichier texte et en respectant la structure attendue par Excel.
        Même combat : pas d'erreur système ou autre, mais que je mette n'importe quoi dans ce fichier texte ... il est systématiquement rempli du fichier "index.php" de mon site, dès que je crée ce nouveau fichier !

        J'ai vu sur différents forums des personnes se plaindre du même constat.

        Que faut-il faire -commande spéciale ???- pour éviter ce pépin ?

        Commentaire


        • #5
          perso j'utilise :
          Code:
          $db->setQuery($query);
                  $items = $db->loadObjectList();
          
                  $csv = fopen('php://output', 'w');
                  fputs($csv, $bom = (chr(0xEF) . chr(0xBB) . chr(0xBF)));
                  $header = array_keys($db->getTableColumns('#__mytable'));
                  fputcsv($csv, $header, ';');
                  foreach ($items as $lines) {
                      fputcsv($csv, (array)$lines, ';', '"');
                  }
          
                  return fclose($csv);
          et çà marche

          Commentaire


          • #6
            Envoyé par elecoest Voir le message
            perso j'utilise :
            Code:
            $db->setQuery($query);
            $items = $db->loadObjectList();
            
            $csv = fopen('php://output', 'w');
            fputs($csv, $bom = (chr(0xEF) . chr(0xBB) . chr(0xBF)));
            $header = array_keys($db->getTableColumns('#__mytable'));
            fputcsv($csv, $header, ';');
            foreach ($items as $lines) {
            fputcsv($csv, (array)$lines, ';', '"');
            }
            
            return fclose($csv);
            et çà marche
            Merci beaucoup elecoest. Je vais tester ceci dans mon script. Mais, sauf erreur, il manque les instructions pour le téléchargement du fichier "output", et il me semble qu'il lui manque le suffixe ".csv" pour être correctement repris et assimilé par Excel ou compatible !
            Dernière édition par Visiteur à 07/12/2018, 08h25

            Commentaire


            • #7
              Envoyé par elecoest Voir le message
              perso j'utilise :
              Code:
              $db->setQuery($query);
              $items = $db->loadObjectList();
              
              $csv = fopen('php://output', 'w');
              fputs($csv, $bom = (chr(0xEF) . chr(0xBB) . chr(0xBF)));
              $header = array_keys($db->getTableColumns('#__mytable'));
              fputcsv($csv, $header, ';');
              foreach ($items as $lines) {
              fputcsv($csv, (array)$lines, ';', '"');
              }
              
              return fclose($csv);
              @elecoest:
              Pourrais-tu stp me dire comment ne récupérer que certaines rubriques de la table traitée ?
              Par exemple, je traite la table "users" et je n'ai besoin que de "username, name et email" (ceci aurait déjà l'avantage de ne pas générer une erreur du type "vous dépassez la capacité en nombre de cellules").
              Avec mes remerciements anticipés.

              Commentaire


              • #8
                en modifiant ta query avec la variable $query

                $db->setQuery($query);

                Commentaire


                • #9
                  Envoyé par elecoest Voir le message
                  en modifiant ta query avec la variable $query

                  $db->setQuery($query);
                  C'est bien ce que je pensais. J'ai bien essayé de préparer un select tel que: "SELECT name, username, email FROM ..." et d'écrire dans le fichier csv le tableau issu de la requête. Je n'ai pas d'erreur, mais en final j'ai toujours la totalité de ma table en colonnes et en lignes. Comme si la fonction spécialisée "fputcsv()" était bétonnée pour tout prendre de la table, sans exception aucune !
                  Et ceci joue même si dans ma requête j'ai placé des conditions du type "WHERE". La macro s'en moque ! Je récupère ainsi de ma table "users" jusqu'au super-administrateur. Aïe !!!
                  Dernière édition par Visiteur à 13/12/2018, 11h34

                  Commentaire


                  • #10
                    euh...

                    c'est ces lignes qui génère les items
                    $db->setQuery($query); $items = $db->loadObjectList(); les items sont générés avant de les écrire dans un fichier.

                    Commentaire


                    • #11
                      Envoyé par elecoest Voir le message
                      euh...

                      c'est ces lignes qui génère les items
                      $db->setQuery($query); $items = $db->loadObjectList(); les items sont générés avant de les écrire dans un fichier.
                      Tout à fait d'accord. Et c'est bien ce que j'ai écrit précédemment. Cette méthode n'est pas sélective, elle reprend systématiquement la totalité des champs de la table. Et par malchance, il y a dans la table "users" dont j'ai besoin quelques champs de texte -sans intérêt pour moi- qui viennent chahuter les cellules Excel bien trop petites pour les contenir.
                      Je vais reprendre mes tests. Il y a quelque chose qui m'échappe.

                      Stp, pourrais-tu me donner le descriptif de ta connexion à la BDD, ainsi que ta requête càd:

                      Code PHP:
                      $db = ...
                      $query = ... 
                      Je comprendrai mieux ainsi quel type de mysql tu utilises ensuite. Merci beaucoup.
                      Dernière édition par Visiteur à 14/12/2018, 07h09

                      Commentaire


                      • #12
                        hello,

                        rien de plus que ce que décrit dans la doc de joomla : https://docs.joomla.org/Selecting_da...g_JDatabase/fr

                        Commentaire


                        • #13
                          Envoyé par elecoest Voir le message
                          hello,

                          rien de plus que ce que décrit dans la doc de joomla : https://docs.joomla.org/Selecting_da...g_JDatabase/fr
                          Ok. Merci pour cette info, car j'avais fait une belle sortie de route. Tout compris, et ça fonctionne enfin.
                          Un seul défaut constaté: la 1ère ligne reprenant les intitulés des rubriques de la Table de BDD est traitée comme une simple ligne de données, et ne s'intègre donc pas dans la ligne de définition des colonnes d'Excel !
                          Certes l'utilisateur peut aisément recopier chaque titre de rubrique et le coller une ligne plus haut dans les titres des colonnes. Mais ce serait chouette d'arriver à l'intégration directe !
                          As-tu remarqué ce petit défaut ?

                          Commentaire


                          • #14
                            ben, c'est un csv pas un xls donc oui c'est normal pour moi

                            Commentaire


                            • #15
                              Envoyé par elecoest Voir le message
                              ben, c'est un csv pas un xls donc oui c'est normal pour moi
                              Excellente remarque! Je dois être assez fatigué en cette fin d'année. Merci encore pour ton aide sur ce sujet, tu m'as bien dépanné.

                              Commentaire

                              Annonce

                              Réduire
                              Aucune annonce pour le moment.

                              Partenaire de l'association

                              Réduire

                              Hébergeur Web PlanetHoster
                              Travaille ...
                              X