VIVEZ LE
FOOTBALL !

Posez votre question Signaler

Importer des feuilles Excel dans MySQL

Gaspard Monge - Dernière réponse le 8 mars 2012 à 10:20
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
Lire la suite 

Importer des feuilles Excel dans MySQL »

39 réponses
Réponse
+24
moins plus
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>
Oussama - 4 nov. 2010 à 13:08
Merci pour votre aide manuramolo :)
abdelali - 1 nov. 2011 à 11:21
Merci
Garfield - 15 nov. 2011 à 20:00
Juste une petite coquille dans ton expression =)> ("DELETE FROM commmunes"); il y a un "m" en trop :)
Ajouter un commentaire
Réponse
+15
moins plus
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. :)
C-Eric - 27 févr. 2009 à 14:09
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
BenDaniel - 22 juil. 2009 à 12:16
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
marwa - 8 mars 2012 à 10:16
dans qu'elle logiciel en va manipuler
Ajouter un commentaire
Réponse
+4
moins plus
Solution pour transférer des données Excel vers MySQL (....)
Ajouter un commentaire
Réponse
+2
moins plus
Installer sur le poste ou tourne EXCEL le driver MyODBC dispo gratuitement
ici : http://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.
Ajouter un commentaire
Réponse
+2
moins plus
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!
fig - 3 févr. 2009 à 16:46
je confirme, talend open studio fait tout ca et c est assez performant, dans le meme style en libre aussi ya kettle
Ajouter un commentaire
Réponse
+1
moins plus
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.
Ajouter un commentaire
Réponse
+1
moins plus
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
Ajouter un commentaire
Réponse
+0
moins plus
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
Ajouter un commentaire
Réponse
+0
moins plus
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
Ajouter un commentaire
Réponse
+0
moins plus
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
Ajouter un commentaire
Réponse
+0
moins plus
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
Anatole - 9 déc. 2006 à 15:08
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.
Ajouter un commentaire
Réponse
+0
moins plus
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
Ajouter un commentaire
Réponse
+0
moins plus
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
Ajouter un commentaire
Réponse
+0
moins plus
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
@+
Ajouter un commentaire
Réponse
+0
moins plus
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
Ajouter un commentaire
Réponse
+0
moins plus
je v une solution trés simple svp
Ajouter un commentaire
Réponse
+0
moins plus
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!
marwa - 8 mars 2012 à 10:20
est ce que en peut travail dans Mysql5.5
Ajouter un commentaire
Réponse
+0
moins plus
Vous pouvez regarder Talendforge pour poser vos questions et trouver des informations : http://www.talendforge.org/
Ajouter un commentaire
Réponse
+0
moins plus
voici la méthode détaillée --> http://www.blog.manit4c.com/2009/05/07/importer-xls-vers-mysql/
Ajouter un commentaire
Réponse
+0
moins plus
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
Ajouter un commentaire
Ce document intitulé « Importer des feuilles Excel dans MySQL » issu de CommentCaMarche (www.commentcamarche.net) est mis à disposition sous les termes de la licence Creative Commons. Vous pouvez copier, modifier des copies de cette page, dans les conditions fixées par la licence, tant que cette note apparaît clairement.
Dossier à la une
Passage au tout numérique : quel coût pour les particuliers ?
Importer des feuilles Excel dans MySQL - page 2