IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

[CSV] Importation de données xls vers mysql [PHP 5.0]


Sujet :

Langage PHP

  1. #1
    Membre éprouvé
    Avatar de beegees
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2004
    Messages
    3 610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 3 610
    Points : 1 277
    Points
    1 277
    Par défaut [CSV] Importation de données xls vers mysql
    Bonjour tout le monde,

    Je dois importer des données de Excel (format xls) vers my base de données mysql.

    J'ai trouvé un code sur le net que voici :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    <?php
    // vérification sur la session authentification (la session est elle enregistrée ?)
    // ici les éventuelles actions en cas de réussite de la connexion
    include('../../Scripts/connexion.php');
    //$sql=mysql_query("DELETE FROM commmunes");
     
    //=========================
    // Traitement des donnees
    //=========================
     
    //recupere le nom du fichier indiqué par l'user
    $fichier=$_FILES["userfile"]["name"];
     
    // ouverture du fichier en lecture
    if ($fichier)
    {
    //ouverture du fichier temporaire
    $fp = fopen ($_FILES["userfile"]["tmp_name"], "r");
    }
    else{
    // fichier inconnu
    ?>
    <p align="center" >- Importation échouée -</p>
    <p align="center" ><B>Désolé, mais vous n'avez pas spécifié de chemin valide ...</B></p>
    <?php
    exit();
    }
    // declaration de la variable "cpt" qui permettra de conpter le nombre d'enregistrement réalisé
    $cpt=0;
    ?>
    <p align="center">- Importation Réussie -</p>
     
    <p align="right"><a href="#bas">Bas de page</a></p>
     
    <?php
    // importation
    while (!feof($fp))
    {
    $ligne = fgets($fp,4096);
    // on crée un tableau des élements séparés par des points virgule
    $liste = explode(";",$ligne);
    // premier élément
    $liste[0] = ( isset($liste[0]) ) ? $liste[0] : Null;
    $liste[1] = ( isset($liste[1]) ) ? $liste[1] : Null;
    $liste[2] = ( isset($liste[2]) ) ? $liste[2] : Null;
    $liste[3] = ( isset($liste[2]) ) ? $liste[2] : Null;
     
     
     
    $champs1=$liste[0]; //ID
    $champs2=$liste[1]; //NOTE
     
    echo'<script LANGUAGE="JavaScript">alert("'.$champs1.'");</SCRIPT>';
     
     
    // pour eviter qu un champs "nom" du fichier soit vide
    if ($champs1!='')
    {
    // nouvel ajout, compteur incrémenté
    $cpt++;
    // requete et insertion ligne par ligne
    // champs1 id en general dc on affecte pas de valeur
     
    $req = mysql_query("INSERT INTO inscrits_en(NOTE) VALUES('$champs2') WHERE inscrits_en.ID = " . $champs1 );
    //echo'<script LANGUAGE="JavaScript">alert("'.$req.'");</SCRIPT>';
     
     
    ?>
    <table width="505" border="1" align="center" cellpadding="0" cellspacing="0" bgcolor="#eeeeee">
    <tr>
    <td width="124">Eléments importés :</td>
    <td width="361"><?php echo $liste[0];?></td>
    <td width="361"><?php echo $liste[1];?></td>
     
    </tr>
    </table>
    <p>
      <?php
    }
    }
     
    // fermeture du fichier
    fclose($fp);
    //on supprime la derniere car elle est vide
     
     
    //==================
    // FIN
    //==================
    ?>
      <br>
      <br>
      Nombre de valeurs nouvellement enregistrées: <b><?php echo $cpt;?></b>.<br>
      <br>
    </p>
    <p>&nbsp;</p>
    Le résultat n'est pas correct, j'obtiens des symbôles un peu partout.

    Je pense déjà avoir trouvé un premier problème :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $liste = explode(";",$ligne);
    Pour excel, je remplace le ; par quoi ?

    Je me demandais aussi si le fopen suffisait pour un xls ?

    Un tout grand merci d'avance pour l'aide.

    beegees

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Je me demandais aussi si le fopen suffisait pour un xls ?
    Non, tu ne peux pas lire un format xls comme si c'etait du texte.
    Il va falloir que tu repartes vers les methodes pour exploiter de l'xls en php ou bien que tu fasses l'import en csv.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Membre éprouvé
    Avatar de beegees
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2004
    Messages
    3 610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 3 610
    Points : 1 277
    Points
    1 277
    Par défaut
    Citation Envoyé par sabotage Voir le message
    Non, tu ne peux pas lire un format xls comme si c'etait du texte.
    Il va falloir que tu repartes vers les methodes pour exploiter de l'xls en php ou bien que tu fasses l'import en csv.
    Salut Sabotage,

    Merci pour ta réponse.

    Est-il possible avec du PHP ou avec WriteExcel de transformer un fichier xls en csv ?

    Merci encore.

    beegees

  4. #4
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Une fois que tu as mis en place de quoi lire un document xls, tu n'as pas besoin de le ré-ecrire en csv, tu peux l'importer.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  5. #5
    Membre éprouvé
    Avatar de beegees
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2004
    Messages
    3 610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 3 610
    Points : 1 277
    Points
    1 277
    Par défaut
    Citation Envoyé par sabotage Voir le message
    Une fois que tu as mis en place de quoi lire un document xls, tu n'as pas besoin de le ré-ecrire en csv, tu peux l'importer.
    C'est bien cette partie du travail où je coince.

    As-tu un bout de code stp ?

    Mon code de mon premier post est donc pour la poubelle ? pas moyen de l'adapter à du xls ?

    Merci pour ton aide.

    beegees

  6. #6
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Non, tu dois utiliser de quoi lire un xls.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  7. #7
    Membre éprouvé
    Avatar de beegees
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2004
    Messages
    3 610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 3 610
    Points : 1 277
    Points
    1 277
    Par défaut Transformer un fichier xls en un fichier csv
    Bonjour tout le monde,

    J'ai un fichier xls qui contient des données.

    J'aimerais transférer les données de mon fichier xls vers mysql.

    Je me demandais si il ne serait pas mieux de transformer le fichier xls en csv ?

    J'ai un script php qui me permet de transférer des données csv vers mysql mais pas xls vers mysql.

    On m'a conseillé ceci :

    lire toutes les cellules d'une ligne de ton fichier xls, tu les envoie dans une ligne du fichier csv par fputcsv
    je me demande quel séparateur je dois utiliser ? :

    par rapport à ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int fputcsv ( resource $handle , array $fields [, string $delimiter [, string $enclosure ]] )
    Est-ce la bonne solution pour mon problème ?

    Merci d'avance.

    beegees

  8. #8
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Je me demandais si il ne serait pas mieux de transformer le fichier xls en csv ?
    Non, comme je te l'ai dit une fois que tu en ais a lire ton fichier xls ligne par ligne, tu peux déjà faire ton insertion dans la base.
    Ecrire les informations que tu viens de lire dans un nouveau fichier puis relire les memes informations dans ton nouveau fichier, ca fait une etape de trop.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  9. #9
    Membre éprouvé
    Avatar de beegees
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2004
    Messages
    3 610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 3 610
    Points : 1 277
    Points
    1 277
    Par défaut
    Citation Envoyé par sabotage Voir le message
    Non, comme je te l'ai dit une fois que tu en ais a lire ton fichier xls ligne par ligne, tu peux déjà faire ton insertion dans la base.
    Ecrire les informations que tu viens de lire dans un nouveau fichier puis relire les memes informations dans ton nouveau fichier, ca fait une etape de trop.
    Je n'en suis pas à lire mon fichier xls ligne par ligne.

    - J'ai réussi à importer mes données dans un fichier xls
    - Les visiteurs peuvent maintenant mettre à jour certaines colonnes (uniquement)

    J'ai demandé à mon prof de PHP/Internet, il m'a dit qu'il n'avait jamais réussi à envoyer des données d'un fichier xls (binaire) vers mysql.

    Je commence donc à douter sur la possibilité de faire cela.

    Merci pour ton aide.

    beegees

  10. #10
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Etant donné qu'il est possible de lire un fichier xls, il est possible de l'importer dans un base de donnée.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  11. #11
    Membre éprouvé
    Avatar de beegees
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2004
    Messages
    3 610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 3 610
    Points : 1 277
    Points
    1 277
    Par défaut
    Citation Envoyé par sabotage Voir le message
    Etant donné qu'il est possible de lire un fichier xls, il est possible de l'importer dans un base de donnée.
    Tu avais raison Sabotage.

    J'utilise Pear et ça fonctionne pas mal.

    Merci à toi.

    beegees

  12. #12
    Candidat au Club
    Inscrit en
    Octobre 2008
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 2
    Points : 2
    Points
    2
    Par défaut Et finalement ?
    Bonjour ! Tu as l'air d'avoir trouvé une chaussure à ton pied, peux tu nous la montrer, je cherche exactement la même chose que toi !!
    Cordialement !
    Yananda

    >> Comment utilise tu Pear pour lire ton xls et l'importer directement dans la base ?

  13. #13
    Membre éprouvé
    Avatar de beegees
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2004
    Messages
    3 610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 3 610
    Points : 1 277
    Points
    1 277
    Par défaut
    Citation Envoyé par yananda Voir le message
    Bonjour ! Tu as l'air d'avoir trouvé une chaussure à ton pied, peux tu nous la montrer, je cherche exactement la même chose que toi !!
    Cordialement !
    Yananda

    >> Comment utilise tu Pear pour lire ton xls et l'importer directement dans la base ?
    Salut,

    Voici mon code que je partage avec grand plaisir :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    <?php
    session_start();
    include("../../../Scripts/connexion.php");
    include("check_cloture.php"); //je déclare une fonction php afin qu'elle soit connue dans cette page (comme avec js); elle sert a voir si le cours n'est pas déja clôturé car il est possible de mofidier les cotes d'un cours clôturé via import d'excel dans le menu utilisateur !!!
    require_once 'Excel/reader.php';
    $compteur_ok = 0; //variable globale pour compter le nombre d'enregistrements qui ont été modifiés dans la base de données
    $compteur_pas_ok = 0; //variable globale pour compter le nombre d'enregistrements qui n'ont pas été modifiés dans la base de données
    $data = new Spreadsheet_Excel_Reader();
     
    $data->setOutputEncoding('UTF-8'); //DD: ici il faut mettre UTF-8 autrement affichage avec des symbôles
     
    //recupere le nom du fichier indiqué par l'user
    $fichier=$_FILES["userfile"]["name"];
     
    $data->read($_FILES["userfile"]["tmp_name"]);
     
    //error_reporting(E_ALL ^ E_NOTICE);
    $donnee;
     
    $LesDonnees = array ("1"=>"", "2"=>"", "3"=>"", "4"=>"", "5"=>""); //Tableau associatif ($LesDonnees), le nom des clés est 1,2,3,4 et 5 parce que dans les boucles for, le j va s'incrémenter de 1 a 5, je mets donc dans la valeur "1" du tableau "LesDonnees" la valeur de $data->sheets[0]['cells'][$i][$j] quand j vaut 1, dans la clé 2 du tableau "LesDonnees" la valeur de $data->sheets[0]['cells'][$i][$j] quand j vaut 2... 
     
     
    for ($i = 1; $i <= $data->sheets[0]['numRows']; $i++) //linges
      {
     
        	for ($j = 1; $j <= $data->sheets[0]['numCols']; $j++) //colonnes
               {
    				$donnee = $data->sheets[0]['cells'][$i][$j]." "; 
    				$LesDonnees[$j] = $data->sheets[0]['cells'][$i][$j];
     
    				if(($j == 5) AND ($i != 1)) //$j == 5 car je dois updater la table QUE lorsque le champ est NOTE (5), donc des que l'on a la cote et l'ID ET $i différent de 1 car je ne dois pas tenir compte des entetes de colonnes qui correspondent a 1 dans (premier passage de la boucle for).
    				{
    						$ok = false;
    						if(is_numeric($LesDonnees['5']))
    						{
    							//je vérifie si la cote est supérieure a zéro et inférieure a 20 alors c'est ok
    							if(($LesDonnees['5'] >= 0) && ($LesDonnees['5'] <= 20)) $ok = true;
    						}
    						else
    						{
    							if(($LesDonnees['5'] == "ABS") || ($LesDonnees['5'] == "R") || ($LesDonnees['5'] == "D") || ($LesDonnees['5'] == "J"))
    							{ 
    								$ok = true;
    								//si c'est une chaine de caractere, j'ajoute les '' autrement, ça ne passe pas !!!
    								$LesDonnees['5'] = "'".$LesDonnees['5']."'";
    							}
    						}
     
    						if($ok)
    						{		
    								//je sélectionne le nom, le type et la catégorie du cours 
    								$cours_cloture = 'SELECT inscrits_en.MNEMONIC, inscrits_en.TYPE_DE_COURS, inscrits_en.CATEGORIE FROM inscrits_en WHERE inscrits_en.ID = '.$LesDonnees['1'];
    								//echo $cours_cloture;
    								$req_cours_cloture = mysql_query($cours_cloture);
    								while ($tab_req_cours_cloture = mysql_fetch_assoc($req_cours_cloture))
    									{
    										//je vérifie ici si le cours est clôturé, car autrement, on pourrait mettre a jour un cours via excel meme si il est clôturé !!!
    									   if(check_cloture($tab_req_cours_cloture['MNEMONIC'],$tab_req_cours_cloture['TYPE_DE_COURS'],$tab_req_cours_cloture['CATEGORIE'] ) == 0)
    										{
    											$sql = 'UPDATE inscrits_en SET NOTE = ' .$LesDonnees['5'].' WHERE inscrits_en.ID = ' .$LesDonnees['1']; 
    											//je  mets directement a jour la base de données 
    											$result = mysql_query($sql);
    											$ok = false;
    											$compteur_ok +=1;
    											// Vérification du résultat
    											// Ceci montre la requete envoyée a MySQL ainsi que l'erreur. Utile pour déboguer.
    										}
    										else
    										{
    											echo 'cours clôturé !';
    											exit();
    										}
    									}
    						}
    						else
    						{
    							$compteur_pas_ok+=1; //nombre d'enregistrement(s) qui n'ont pas été ajoutés dans la bd
    						}
     
    					if (!$result) 
    					{
    						$message  = 'Requete invalide : ' . mysql_error() . "\n";
    						die($message);
    					}
     
    				}
     
     
     
      		}
      }
     
     
    echo('Le document a été envoyé vers le serveur avec succes, la table a été mise a jour');?>
    </br></br>
    <?php
    //echo($compteur_ok . "ont été ajoutés a la base de données");
     
    echo 'Nombre d\'enregistrements modifiés dans la table : ' . $compteur_ok . '</br>'; 
    echo 'Nombre d\'enregistrements non ajouté(s) : ' . $compteur_pas_ok; 
     
    	//var_dump($t_donnees);
     
    	//print_r($data);
    	//print_r($data->formatRecords);
    ?>
    Il y a pas mal de commentaires, cela devrait donc t'aider.

    Tu dois donc télécharger write_excel et déclarer la classe au début dans ton code.

    En espérant que cela va t'aider.

    beegees

  14. #14
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 638
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 638
    Points : 66 667
    Points
    66 667
    Billets dans le blog
    1
    Par défaut
    oui au départ le code initial était pour du csv ...
    Ma page Developpez - Mon Blog Developpez
    Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts)
    Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...
    Votre post est résolu ? Alors n'oubliez pas le Tag

    Venez sur le Chat de Développez !

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

Discussions similaires

  1. Importer données XLS vers Windev
    Par cheikhoufia dans le forum WinDev
    Réponses: 4
    Dernier message: 08/09/2015, 10h59
  2. Importation des données .txt et .xls vers MySQL
    Par Ammouna1204 dans le forum Documents
    Réponses: 7
    Dernier message: 05/09/2012, 15h00
  3. [XL-2003] Export données XLS vers CSV
    Par Monfy29 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 09/12/2011, 14h19
  4. import données .doc vers mysql
    Par honey0 dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 2
    Dernier message: 22/08/2011, 14h14
  5. Réponses: 6
    Dernier message: 28/05/2008, 09h04

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo