Importer des feuilles Excel dans MySQL

Gaspard Monge -  
 katr vin -
Bonjour,
Actuellement, je développe une application PHP/MySQL pour un système de maintenance en remplacment d'un système de fichiers
Excel. Pour garder l'historique je doit récupérer toutes les données des feuilles Excel( il y en a 3900).

Voici les données :
1- Chaque fichier Excel doit correspondre à un enregistrement dans la nouvelle base.
2- Dans les fichiers Excel, les données se trouvent dans les mêmes cellule d'un fichier à l'autre.(A quelques
exceptions)
3- Les feuilles Excel comportent 20 Colonnes sur 60 Lignes.
4- Les fichiers Excel comportent deux onglets
5- J'utilise Excel 97 et PHP 4.2.0 / MySQL 3.23.49, le tout sous Windows NT 4.0 SP6a

Hormis la transformation de .XLS vers un .SLK ou .CSV ou .TXT (ce qui dans mon cas, me demande beaucoup de temps)
existe-t-il une autre façon qui me permettrait de récupérer les données ?
Actuellement je sèche complètement..
Merci d'avance

22 réponses

  • 1
  • 2
Résumé de la discussion

Le fil expose la problématique de migrer des données issues de 3900 fichiers Excel vers une base MySQL, chaque fichier représentant une entrée et comportant deux onglets, 20 colonnes et 60 lignes. Les solutions évoquées incluent l’export en CSV ou TXT, l’utilisation d’outils ETL comme Talend Open Studio, ou l’emploi d’un driver ODBC/MySQL, pour accélérer l’import et contourner le travail manuel. Des approches pratiques mentionnées incluent l’utilisation de LOAD DATA LOCAL INFILE lorsque l’hébergement le permet, ou l’import via PHP/MySQL avec des fichiers texte et la conversion simple vers CSV. En cas de limitations d’hébergement, privilégier des imports par lots via CSV et des outils open source: Talend, ou des scripts simples, permettent de traiter des milliers d’enregistrements rapidement.

Généré automatiquement par IA
sur la base des meilleures réponses
  1. manuramolo
     
    voici ma proposition en php
    formulaire
    <form method="post" enctype="multipart/form-data" action="import_requete_communes.php">
    <table width="628" border="0" align="center" cellpadding="5" cellspacing="0" bgcolor="#eeeeee">
    <tr>
    <td width="500"><font size=3><b>Selectionner votre fichier *.csv :</b></font></td>
    <td width="244" align="center"><input type="file" name="userfile" value="userfile"></td>
    <td width="137" align="center">
    <input type="submit" value="Envoyer" name="envoyer">
    </td>
    </tr>
    </table>
    </form>

    récupération en php

    <?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
    require_once('connect.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;

    $champs1=$liste[0];
    $champs2=$liste[1];
    $champs3=$liste[2];

    // 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

    mysql_query("INSERT INTO communes(dep, com, nomcom) VALUES('$champs1','$champs2','$champs3' )");

    $dep="dep";
    mysql_query("DELETE FROM communes WHERE (dep='$dep')");

    ?>
    <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>
    <?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>

    <a name="bas"></a>
    <p align="right"><a href="#haut">Haut de page</a></p><br>
    31
    1. stefart
       
      salut manuramolo !
      merci pour ton super code
      J'ai donc ajouté ton code a mon site et il marche impeccable !

      stp juste une ptite info si je ne souhaite pas intégré l'ensemble des colonne du fichier .csv
      Comment faire ??

      exemple :

      dans mon .csv
      j'ai des colonnes de A a L et je ne souhaite importé que les colonnes A, C, E, F et G


      $liste[0] = ( isset($liste[0]) ) ? $liste[0] : Null;
      $liste[3] = ( isset($liste[3]) ) ? $liste[3] : Null;
      $liste[5] = ( isset($liste[5]) ) ? $liste[5] : Null;
      $liste[6] = ( isset($liste[6]) ) ? $liste[6] : Null;
      $liste[7] = ( isset($liste[7]) ) ? $liste[7] : Null;

      $champs1=$liste[0];
      $champs2=$liste[3];
      $champs3=$liste[5];
      $champs4=$liste[6];
      $champs5=$liste[7];

      et ensuite :
      mysql_query("INSERT INTO communes (dep, com, nomcom, numdep, picto ) VALUES('$champs1','$champs2','$champs3','$champs4','$champs5' )");


      c'est bien ça ?
      0
    2. Oussama
       
      Merci pour votre aide manuramolo :)
      0
    3. abdelali
       
      Merci
      0
    4. Garfield
       
      Juste une petite coquille dans ton expression =)> ("DELETE FROM commmunes"); il y a un "m" en trop :)
      0
    5. gerard
       
      merci
      0
  2. kalamit
     
    Moi j'ai encore plus simple.
    Tu enregistres ton xls au format csv et tu l'importes dans phpmyadmin (si tu as phpmyadmin). 3 minutes chrono, montre en main. :)

    Kalamit,
    10 jours avant le soleil, la mer et les mouettes. :)
    17
    1. fred
       
      salut kalamit,

      super simple mais comment tu importes un fichier csv dans phpmyadmin
      0
    2. Daniel > fred
       
      Super simple :)
      1 tu cliques sur ta table
      2 vers le centre de la page ouverte tu cliques sur le lien "Insert data from a textfile into table"
      3 dans le champ à gauche de "Fields terminated by" tu remplace le ; par une ,
      4 cliquez submit
      5 prendre un bon café

      a+
      0
    3. Romeof Messages postés 34 Statut Membre 1 > Daniel
       
      Merci Daniel, sa été de grande utilité pour moi.
      je vous remercie infiniment.
      0
    4. C-Eric > Romeof Messages postés 34 Statut Membre
       
      Bonjour Romeof,
      Je me trouve dans la même situation de voir actualiser ma base MySQL à partir d'un fichier Excel mais comment obtenir "Insert data from a textfile into table" ?

      Merci d'avance

      Eric
      0
    5. Ben > Daniel
       
      Bonjour Daniel,

      J'ai le même problème et ta solution fonctionne. Simplement, j'ai un champ qui s'auto incrémente dans ma base (un indice, clé primaire) et phpmyadmin refuse de m'importer mon doc excel si je ne remplis pas aussi ce champ que j'aimerai laisser blanc pour qu'il s'auto incrémente. Y a-t-il une solution?

      Merci d'avance pour ton aide.

      Benjamin
      0
  3. Worldpeace
     
    Solution pour transférer des données Excel vers MySQL (....)
    5
  4. Worldpeace
     
    Installer sur le poste ou tourne EXCEL le driver MyODBC dispo gratuitement
    ici : https://dev.mysql.com/downloads/connector/odbc/5.1.html

    Paramêtrer le driver : Start => Controle Panel => Administrative Tool => Datasource ODBC => Source Données Utilisateur => Ajouter => MySQL ODBC 5.1
    Paramètrer : un bon tuto ici :
    http://www.asp-php.net/tutorial/asp-php/iis_et_mysql.php?page=3

    Dans le classeur mettre une proc VBA de ce genre

    '******************************************************
    'Dans cet exemple Il doit y avoir une Base MaBase avec une Table MaTable et 2 champs
    'Dans cet exemple il doit y avoir une feuille Excel (Sheet1) avec 2 colonnes de données

    Option Explicit
    ' http://www.tanguay.info/web/codeExample.php?id=847
    Dim objDB, arrRecord, strRecord, strOutput
    Dim oRS, nRec, oFld
    Dim row
    Dim SqlRequest

    Dim C1
    Dim Temp0
    Dim Temp1

    Private Sub btnTestReadInMysqlData_Click()

    Dim objDB, arrRecord, strRecord, strOutput
    Dim oRS, nRec, oFld
    Dim row
    Sheet2.Cells(1, 4).Value = Now
    'Database connection & select all from Table
    Set objDB = DBConnect()

    For C1 = 2 To 1002
    Temp0 = Replace(Sheet1.Cells(C1, 1).Text, ",", ".")
    Temp1 = Replace(Sheet1.Cells(C1, 2).Text, ",", ".")

    SqlRequest = "INSERT INTO `MaBase`.`MaTable` (`MonChamps1` ,`MonChamps2`)VALUES ('" & Temp0 & "' , '" & Temp1 & "');"
    Set oRS = objDB.Execute(SqlRequest)

    Sheet2.Cells(2, 4).Value = Now
    Sheet2.Cells(3, 4).Value = C1
    Next C1
    End Sub

    Function DBConnect()
    Set objDB = CreateObject("ADODB.Connection")
    objDB.Open "MYSQL_BlueBears"
    Set DBConnect = objDB
    End Function

    '******************************************************
    avec une liaison ADSL et un hebergement mutualisé 1000 requêtes = 3 minutes... et à peine plus si la requête est plus longue => c'est donc la connexion à la base qui prend du temps.
    2
    1. katr vin
       
      Bonjour,
      Et si je ne veux pas utiliser ce ODBC est ce qu'il d'autre solution?
      En fait je vous demande tout simplement si c'est possible d'importer des fichier xlsx vers MySQL via php seulement!!!
      Merci

      Vin katr
      0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. Gtld Messages postés 25 Statut Membre 25
     
    Bonjour Trscut,

    Vous pourriez peut-être utiliser des outils ETL disponible sur le net. Ils font ce que vous recherchez (et d'avantage). Par contre, êtes-vous prêt à investir dans des programmes couteux? Si ça n'est pas le cas et comme ça a plutot l'air d'être un projet en "one shot", je recommanderais d'utiliser des outils ETL open source, téléchargeable gratuitement.

    Vous pouvez regarder Talend Open Studio, c'est assez facile d'utilisation. Voici le lien de téléchargement: http://www.talend.com/solutions-data-integration/data-migration.php
    2
  7. Trscut
     
    J'ai regarde quelques outils ETL et cela semble etre ce dont j'ai besoin. J'essayerais Talend et donnerais un avis. Merci pour votre aide!
    2
    1. fig
       
      je confirme, talend open studio fait tout ca et c est assez performant, dans le meme style en libre aussi ya kettle
      0
  8. Worldpeace
     
    Pour l'import de données en masse c'est "LOAD DATA LOCAL INFILE " la solution la plus rapide, la plus puissante, la plus élégante....
    ... Mais la plus part des hebergeurs désactivent la fonction.

    PHPMyADMIN, quand il est proposé par l'hebergeur , est une manière détournée d'accéder à cette fonction.
    Une insertion de fichier .CSV sur 3 champs et 65000 enregistrements en moins de 30 secondes.
    Selection de la table => Importer => CSV via LOAD DATA + option : LOCAL

    Contraintes : le nombre (et le type de données) de colonnes du CSV doit correspondre à celui des champs renseignés dans "nom des colonnes" . Les noms de colonnes doivent correspondre aux noms des champs dans la base.

    En revanche pas de requete complexes possible (update, insert/update, etc...), c'est du chargement en masse point barre.
    1
  9. mehdi
     
    salut:
    il ya une méthode mais elle est un peu compliqué alors:
    tu entre sur access , tu importe ton fichier excel, puis tu fabrique une requette (toujours avrc access), puis tu va pour télecharger Sqlporter
    sur la page
    http://www.realsoftstudio.com/sqlportermysqled.php
    puis , et avec sqlporter tu importe ton fichier access crée
    dans les base de donnée de easyphp
    tu va voir ta table exel s'afficher
    si tu n'as pas compris , tu peut me comtacter sur mon email
    j'éspére que tu peut faire ses étape
    aurevoir
    0
  10. Laurent ABRIAL
     
    Bonjour,
    Tu peux transférer des données Excel ou Access vers unez base MySQL avec XLSMagique (http://www.odbcphp.fr.st/) : gratuit ou avec ou avec l'outil : MySQL Migration Toolkit d'Intelligent Converters qui est payant
    0
  11. fred
     
    Merci Daniel c'est bien ce que j'ai fait mais par un mystère que je ne m'explique pas, l'import se fait dans le premier champ et tous les autres (il y en a 6 en tout) affichent NULL.
    As tu une explication?

    Merci

    Fred
    0
  12. Lionel
     
    Bonjour,
    si vous avez encore besoin, voici comment j'ai fait :
    C'est essentiel = Votre base doit être complètement mise en forme
    "Champ1","Champ2","Champ3", etc, ... et finir par "

    Utilisez les fonctions 'concatener' d'excel ou 'rechercher'remplacer' de Word ou excel pour faire ça.

    Conservez la première ligne avec les noms de champs identiques à votre base MySQL. Enregistrer en format .TXT

    Puis dans MySql, choisissez d'importer un fichier texte
    Mettre le nom du fichier créé avant
    Cochez "remplacer"
    Champs terminés par , (la virgule)
    Et enfin cliquez sur "exécuter"

    A ma grande surprise (j'ai utilisé MySql pour la 1ère fois aujourd'hui), j'ai récupéré plus de 4000 lignes en quelques sacondes
    0
    1. Anatole
       
      Salut,

      Je rencontre une difficuté: je ne sais pas quoi mettre dans la case "ligne terminée par" demandée par PHPmyAdmin.

      Par défaut il y a "auto" mais ça ne marche pas.

      Quel caractère termine une ligne dans un fichier CSV exporté de Excel ?

      Merci, Anatole.
      0
  13. chkoba
     
    bsr
    svp jai un fichier exel qui porte l'emploi de temps des tous les filiere et tous les classe ainsi les sale et les enseignant desirer
    j'aimerai que ce ficher soit un table dans ma base de donner avec les meme champs "classe""groupes""sale" jour""enseignant"
    je l'ai transformer a un fichier acces "extension csv"mais a l'importation elle me sort une erreure dans la ligne 112et voici l'ereur"
    Warning: mb_strpos(): Unknown encoding or conversion error. in c:\program files\easyphp1-8\phpmyadmin\libraries\string.lib.php on line 112"
    merci d'avance
    0
  14. marzouk
     
    svp lorsque j'ai fait l'importation la table est rempli de n'importe quoi il me donne le message
    Warning: mb_strpos(): Unknown encoding or conversion error. in c:\program files\easyphp1-8\phpmyadmin\libraries\string.lib.php on line 112
    0
  15. cannarc Messages postés 1 Statut Membre
     
    Et alors, tu as eu des infos à prpos de cette erreur 112 ?
    J'ai le même problème après avoir exporté ma base Access vers un fichier .txt(séparateur)
    Puis, je veux l'importer pour créer ma base est résultat:

    Warning: mb_strpos() [function.mb-strpos]: Unknown encoding or conversion error. in C:\Program Files\EasyPHP 2.0b1\phpmyadmin\libraries\string.lib.php on line 112

    Warning: mb_strpos() [function.mb-strpos]: Unknown encoding or conversion error. in C:\Program Files\EasyPHP 2.0b1\phpmyadmin\libraries\string.lib.php on line 112

    Warning: mb_strpos() [function.mb-strpos]: Unknown encoding or conversion error. in C:\Program Files\EasyPHP 2.0b1\phpmyadmin\libraries\string.lib.php on line 112

    Fatal error: Cannot use string offset as an array in C:\Program Files\EasyPHP 2.0b1\phpmyadmin\libraries\sqlparser.lib.php on line 922


    Merci de m'aider, je suis débutant en la matière ...
    mon adresse: raphael_roger sur hotmail point com
    @+
    0
  16. anaji Messages postés 1 Date d'inscription   Statut Membre
     
    je voulais importé un fichier .xls vers bd mysql seulement il ya un message d'erreur:
    Erreur
    requête SQL:

    13°1 ABDALLAH HASSAN ADEN NR M03 /12 /914°0123°1 ABOUBAKER MOUSSA ADAWEH RED M11 /04 /923°533°1 AHMED HOUSSEIN ROBLEH NR M19 /08 /904°0643°1 ALI MAHFOUD ALI RED M12 /01 /913°1053°1 ALI MOHAMED ALI NR M22 /01 /904°0863°1 ARWIN GAWAD AHMED NR M28 /07 /914°0373°1 ASSED MOHAMED ABOUBAKER NR M05 /07 /914°0183°1 ASSIA ALI KAMIL NR F24 /07 /904°0293°1 BAHDON ELMI DJAMA NR M08 /06 /90 AS 103°1 BAHGA AHMED ISMAEL RED F05 /03 /893°8113°1 BOUHO MOHAMED AHMED NR F30 /12 /924°07123°1 FAIZA GADITO HOUMED RED F08 /09 /913°3133°1 FAIZA MOHAMED ISMAEL NR F17 /12 /914°12143°1 FATO MAHMOUD AHMED NR F01 /04 /904°10153°1 FATOUMA FOUAD MOHAMED NR F12 /06 /914°14163°1 FEROUZ FOSI ABDALLAH etc.................

    et à la fin:
    MySQL a répondu:

    #1064 - Erreur de syntaxe près de '1 3°1 ABDALLAH HASSAN ADEN NR M 03/12/91 4° 01
    2 3°1 ABOUB' à la ligne 1

    je travail sur easyphp avec os winows xp pro,pourtant j'ai tous fait pour faire concorder les schamps mysql de ma table et ceux du fichier xls.
    aider moi svp c'est travail que je dois rendre a mon chef au plutöt.
    merci d'avance kik c soit
    0
  17. Trscut
     
    Bonjour à tous,

    J'ai besoin de faire du tranfert de data (nom de client, addresse etc) d'excel et access vers MySQL. Je n'ai pas vraiment de background technique et souhaiterais que l'opération soit aussi simple que possible.

    Des idées? Merci!
    0
    1. marwa
       
      est ce que en peut travail dans Mysql5.5
      0
  18. overdoze
     
    bonjour a tous
    merci pour ce bout de code ça marche, il fait l'importation mais il m'affiche un
    Notice: Undefined index: userfile in C:\wamp\www\monsite\import_mails.php on line 47
    0
  19. mmerlange
     
    Bonjour,
    j'ai une très grosse base sous Excel (j'ai la mm ss Access) et pour faire l'import en cvs, j'ai du m'y reprndre par paquets (max 2 Mo par paquet...): j'y ai passé des heures.
    Je viens de peter ma base et vais devoir recommencer. Je déprime et suis pas pret à mm galère...
    Sans connaitre, j'ai vu que certaines bases utilisaient des fichiers .dump. Comment font les pros pour faire leurs sauvegardes et les reimporter?
    Merci, j'ai pas envie de repasser une nuit à faire des copier/coller...
    -1
    1. Valérie
       
      Pour transférer une base excel sur access il suffit de créer une nouvelle table access en passant par fichier, données externes et ensuite suivre la procédure de création de table proposée par access.

      VD
      0
  • 1
  • 2