Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 19 sur 19
  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    novembre 2012
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : novembre 2012
    Messages : 90
    Points : 18
    Points
    18

    Par défaut Export Excel et échappement

    Bonjour à tous,
    j'exporte dans une feuille Excel différentes données issues de ma BD. Certaines sont des chaînes de caractères pouvant contenir des caractères spéciaux (des ' notamment). Je les gère actuellement à l'aide de la fonction mysql_real_escape_string. Cependant j'aimerai ne plus avoir dans mes cellules les antislashs dûs à l'échappement.
    Existe-il une autre fonction ou une autre méthode que je pourrai appliquer?

    D'avance, merci.

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro Vincent
    Inscrit en
    juillet 2005
    Messages
    20 704
    Détails du profil
    Informations personnelles :
    Nom : Homme Vincent

    Informations forums :
    Inscription : juillet 2005
    Messages : 20 704
    Points : 27 014
    Points
    27 014

    Par défaut

    Si tu as des \ dans ta base de données c'est que tu as echappé tes données deux fois.

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    novembre 2012
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : novembre 2012
    Messages : 90
    Points : 18
    Points
    18

    Par défaut

    Non je n'ai pas de \ dans ma BD, ils sont présents sur la feuille Excel une fois exportée.
    Si je transfère directement ces données sur la feuille, j'ai un problème de mise en forme (passages à la lignes...) que je n'ai pas en utilisant mysql_real_escape_string.
    En revanche mes cellules contiennent des \ devant chaque ' par exemple, ce que je voudrai supprimer.

  4. #4
    Modérateur
    Avatar de sabotage
    Homme Profil pro Vincent
    Inscrit en
    juillet 2005
    Messages
    20 704
    Détails du profil
    Informations personnelles :
    Nom : Homme Vincent

    Informations forums :
    Inscription : juillet 2005
    Messages : 20 704
    Points : 27 014
    Points
    27 014

    Par défaut

    Pourrais-tu expliciter les problèmes de mise en forme que tu rencontres alors ?

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    novembre 2012
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : novembre 2012
    Messages : 90
    Points : 18
    Points
    18

    Par défaut

    Comme dis dans le précédent post, si je n'utilise pas mysql_real_escape_string j'ai des passages à la ligne non voulus dans mon fichier Excel : le contenu de certaines celulles finit à la ligne suivante :
    au lieu d'avoir un tableau de ce style :
    Code :
    1
    2
    3
    4
    5
        A   B  C 
    1  A1 B1 C1
    2  A2 B2 C2
    3  A3 B3 C3
    4  A4 B4 C4
    J'ai :
    Code :
    1
    2
    3
    4
    5
    6
       A  B  C
    1 A1 B1 C1
    2 A2 B2
    3 B2 C2
    4 A3 B3 C3
    5 A4 B4 C4
    J'espère que c'est un peu plus clair...

  6. #6
    Modérateur
    Avatar de rawsrc
    Homme Profil pro Martin
    Dev indep
    Inscrit en
    mars 2004
    Messages
    3 416
    Détails du profil
    Informations personnelles :
    Nom : Homme Martin
    Âge : 38
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : mars 2004
    Messages : 3 416
    Points : 7 742
    Points
    7 742

    Par défaut

    Salut,

    comment fais-tu pour exporter tes données ?
    Un bout de code ?
    # Dans la Création, tout est permis mais tout n'est pas utile...

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    novembre 2012
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : novembre 2012
    Messages : 90
    Points : 18
    Points
    18

    Par défaut

    Bonjour,
    voici un extrait (le tableau exporté contient près de 50 colonnes) :
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    <?php
    // Ouverture de session
    session_start();
     
    // Récupération du tableau
    $tabid=$_SESSION['id'];
     
    // Transformation du tableau 
    $listeid = "'".implode("', '", array_map('mysql_real_escape_string', $tabid))."'";
     
    header("Content-type:application/vnd.ms-excel");
    header("Content-disposition:attachment;filename=ExportProjet.xls");
     
    //connexion à la base de données
    include("connectionBD.php");
     
    // requête sur la base de données  
    $requete="SELECT id, a, b, c, ... FROM table WHERE id IN ({$listeid})";
    $resultat=mysql_query($requete) or die ('ERREUR'.mysql_error());
     
    // création de la chaine de caractere à exporter 
    // initialisation de la chaine
    $excel=" ";
    // Entetes
    $excel .="ID \t A \t B \t C \t ... \n";
    // Contenu
    while ($ligne=mysql_fetch_assoc($resultat))
    	{
    // Récupération des résultats de la requete et rangement dans variables
    $id=$ligne["id"];
    $a=mysql_real_escape_string($ligne["a"]);
    $b=mysql_real_escape_string($ligne["b"]);
    $c=mysql_real_escape_string($ligne["c"]);
    ...
    // Ajout des données dans la chaine 
    $excel .="$id \t $a \t $b \t $c \t ... \n";
    }
    // execution
    print$excel;
    exit;
     
    // Fermeture de la session
    session_destroy();
    ?>

  8. #8
    Modérateur
    Avatar de rawsrc
    Homme Profil pro Martin
    Dev indep
    Inscrit en
    mars 2004
    Messages
    3 416
    Détails du profil
    Informations personnelles :
    Nom : Homme Martin
    Âge : 38
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : mars 2004
    Messages : 3 416
    Points : 7 742
    Points
    7 742

    Par défaut

    euh, tu n'utilises aucune librairie tierce pour générer un fichier excel valide ?
    Ce que tu envoies c'est du csv avec la tabulation pour séparateur et comme tu peux t'en douter c'est assez différent du format Excel.

    Au lieu de mettre le header sur excel, essaies en le remplaçant par
    Code :
    header('content-type: text/csv');
    # Dans la Création, tout est permis mais tout n'est pas utile...

  9. #9
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    novembre 2012
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : novembre 2012
    Messages : 90
    Points : 18
    Points
    18

    Par défaut

    oui c'était bien un csv et non un excel.

    J'ai changé la ligne concernée mais j'ai toujours ce problème d'escape :
    - avec j'ai des \ devant mes '
    - sans j'ai un fichier plein d'erreurs

    Pour la librairie ce n'est peut-être pas nécessaire puisque le format csv me convient mais je voudrai des cellules propres (sans les \).

  10. #10
    Modérateur
    Avatar de sabotage
    Homme Profil pro Vincent
    Inscrit en
    juillet 2005
    Messages
    20 704
    Détails du profil
    Informations personnelles :
    Nom : Homme Vincent

    Informations forums :
    Inscription : juillet 2005
    Messages : 20 704
    Points : 27 014
    Points
    27 014

    Par défaut

    Une chose sûre c'est que mysql_real_escape_string n'est pas la fonction adaptée pour des données provenant d'une requête.
    Il faudrait que tu ouvres le CSV obtenu avec un editeur de texte pour voir exactement ce qui est produit.

    Utilise le point-virgule comme séparateur, c'est le séparateur reconnu par défaut sur Excel en français.

  11. #11
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    novembre 2012
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : novembre 2012
    Messages : 90
    Points : 18
    Points
    18

    Par défaut

    Le problème est qu'il interprête les ' ou certains espaces (comme des nombres écrit comme ça : x xxx) comme fin de lignes. Je trouve donc la fin du contenu de ma cellule dans la première cellule de la ligne suivante et les cellules qui suivaient dans les cellules suivantes (est-ce clair?).

    J'ai changé les /t par des ; et je me retrouve avec toute la ligne dans la première cellule (les ; séparant les différents champs).

  12. #12
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    novembre 2012
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : novembre 2012
    Messages : 90
    Points : 18
    Points
    18

    Par défaut

    Re-bonjour,
    J'ai peut-être un début d'explication : Les retours à la lignes se produisent en fait lorsqu'il y a un retour à la ligne dans la cellule (Les données proviennent à la base d'un fichier Excel que j'ai importé sur MySQL).

    Exemple :
    - Lorsque ma cellule contient le texte :
    "bravo alberto, c'est bien"
    aucun problème

    - Lorsque ma cellule contient le texte :
    "bravo alberto
    c'est bien"
    La je trouve le "bravo alberto" à sa place dans la bonne cellule et le "c'est bien" dans la première cellule de la ligne suivante.

    Quand j'utilise mysql_real_escape_string, j'ai "bravo alberto\nc\'est bien" et je voudrai "bravo alberto, c'est bien".

    J'espère avoir été un peu plus clair avec cet exemple. Je vous ai peut-être induit en erreur avec mes ' qui n'étaient pas le problème (a priori).

  13. #13
    Modérateur
    Avatar de sabotage
    Homme Profil pro Vincent
    Inscrit en
    juillet 2005
    Messages
    20 704
    Détails du profil
    Informations personnelles :
    Nom : Homme Vincent

    Informations forums :
    Inscription : juillet 2005
    Messages : 20 704
    Points : 27 014
    Points
    27 014

    Par défaut

    Tu peux alors remplacer les retours à la lignes :
    Code :
    $ligne= str_replace(trim($ligne), "\n", " ");

  14. #14
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    novembre 2012
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : novembre 2012
    Messages : 90
    Points : 18
    Points
    18

    Par défaut

    Bonjour,
    ça fonctionne quand je l'utilise ainsi :
    Code :
    $ligne=str_ireplace("\n"," ",trim($ligne));
    Par contre j'ai toujours le problème sur quelques cellules.
    J'ai remarqué que ces cellules ont en commun de :
    - soit contenir un nombre suivi d'un retour à la ligne
    exemple1 :
    "bravo 12.45
    alberto"
    => alberto se retrouve dans la première cellule de la ligne suivante

    - soit contenir un point ou une virgule, précédé d'un nombre et suivi d'un retour à la ligne
    exemple2 :
    " bravo 12.45.
    alberto"
    => pareil

  15. #15
    Modérateur
    Avatar de sabotage
    Homme Profil pro Vincent
    Inscrit en
    juillet 2005
    Messages
    20 704
    Détails du profil
    Informations personnelles :
    Nom : Homme Vincent

    Informations forums :
    Inscription : juillet 2005
    Messages : 20 704
    Points : 27 014
    Points
    27 014

    Par défaut

    Utilise fputcsv() elle se charge de protéger les chaines de caractère.

  16. #16
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    novembre 2012
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : novembre 2012
    Messages : 90
    Points : 18
    Points
    18

    Par défaut

    Je ne connaissais pas cette fonction, j'ai donc procédé méthodiquement en suivant l'exemple ici.

    Mon code est le suivant:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    <?php
    // Ouverture de session
    session_start();
     
    // Récupération du tableau
    $tabid=$_SESSION['id'];
     
    // Transformation du tableau
    $listeid = "'".implode("', '", array_map('mysql_real_escape_string', $tabid))."'";
     
    header("content-type: text/csv");
    header("Content-disposition:attachment;filename=ExportProjet.csv");
     
    //connexion à la base de données
    include("connectionBD.php");
     
    // requête sur la base de données  
    $requete="SELECT id, a, b, c, ... FROM table WHERE id IN ({$listeid})";
    $resultat=mysql_query($requete) or die ('ERREUR'.mysql_error());
     
    $fp=fopen('ExportProjet.csv','w');
     
    $tab=array();
    $tab=array('id','a','b','c',...);
     
    while ($ligne=mysql_fetch_assoc($resultat))
    	{
    // Récupération des résultats de la requete et rangement dans variables
    $id=$ligne["id"];
    $a=str_ireplace("\n"," ",trim($ligne["a"]));
    $b=str_ireplace("\n"," ",trim($ligne["b"]));
    $c=str_ireplace("\n"," ",trim($ligne["c"]));
    ...
    $tab=array('$id','$a','$b',...);
    fputcsv($fp,$tab);
    }
     
    // execution
    fclose($fp);
     
    // Fermeture de la session
    session_destroy();
    ?>
    Mais ce code ne fonctionne pas, le fichier reste vide.

  17. #17
    Modérateur
    Avatar de sabotage
    Homme Profil pro Vincent
    Inscrit en
    juillet 2005
    Messages
    20 704
    Détails du profil
    Informations personnelles :
    Nom : Homme Vincent

    Informations forums :
    Inscription : juillet 2005
    Messages : 20 704
    Points : 27 014
    Points
    27 014

    Par défaut

    Enlève tes apostrophes autour des variables.

  18. #18
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    novembre 2012
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : novembre 2012
    Messages : 90
    Points : 18
    Points
    18

    Par défaut

    Mon fichier reste vide.

  19. #19
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    novembre 2012
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : novembre 2012
    Messages : 90
    Points : 18
    Points
    18

    Par défaut

    Bon je suis revenu à la première méthode qui fonctionnait presque. J'ai modifié manuellement les cellules qui posaient problème je vais ajouter le str_ireplace sur les nouvelles saisies.

    Merci à sabotage et rawsrc pour leur précieuse aide et leur temps.

    Sujet résolu

+ Répondre à la discussion
Cette discussion est résolue.

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •