Excel vers Mysql - Distributions
Transcription
Excel vers Mysql - Distributions
Retour Une co-production Florence CABON, POPI, Michel PIERRON et Christian HERBÉ EXCEL communique avec MYSQL-WEB Langages utilisés: VBA, PHP et SQL OBJECTIF 1 Depuis Excel et d'un seul clic, insérer les données de la feuille active dans une base de données du web OBJECTIF 2 depuis une page web, envoyer le résultat d'une requête Mysql directement dans Excel OBJECTIF 3 Depuis Excel, faire une requête PHP-MYSQL dans une seule cellule A voir aussi: Une approche sensiblement différente de cette problématique sur EXCELABO OBJECTIF 1 Au départ, on a ce fichier Excel: Partant de la feuille Excel, on veut insérer les lignes 2 et 3 dans cette table MYSQL, sur un serveur WEB: Outils nécessaires côté micro: Excel97 ou supérieur version Windows (moyennant quelques modifications mineures, ça devrait tourner sur Mac) Internet Explorer (c'est mal, je sais) Client FTP (contenu dans Windows) Outils nécessaires côté serveur: disposer des droits webmaster le celèbre tandem PHP MYSQL Travaux à réaliser: écrire une macro VBA-Excel qui: sauvegarde la feuille Excel dans un fichier au format CSV (séparateur point-virgule) pilote le transfert du fichier CSV sur le serveur par FTP ouvre une page WEB contenant un script PHP afin d'insérer les données dans la base MYSQL écrire un fichier texte contenant les commandes FTP exécutées par le client FTP-DOS écrire le script PHP-MYSQL Listing de la macro VBA (seules les lignes en bleu sont utiles, le vert est du commentaire): Sub xl2php() 'déclaration du nom du fichier csv nom_fichier = "tempo.csv" 'déclaration du site à joindre site_web="http://www.site.fr/page_contenant_script.php" 'déplacement vers le dossier temporaire ChDir Environ("TEMP") 'copie des cellules contiguës à A1 Range("A1").CurrentRegion.Copy 'ouverture d'un nouveau document Excel Workbooks.Add '"collage" des données ActiveSheet.Paste 'désactivation de la copie Application.CutCopyMode = False 'désactivation des questions posées à l'utilisateur par Excel Application.DisplayAlerts = False 'suppression des feuilles inutiles For i = 2 To Worksheets.Count Worksheets(Worksheets.Count).Delete Next i 'sauvegarde du nouveau document au format CSV ActiveWorkbook.SaveAs Filename:=nom_fichier, FileFormat:=xlCSV, CreateBackup:=False 'fermeture du document sauvegardé ActiveWindow.Close 'exécution du programme FTP.EXE fourni par Windows 'notez l'option -S: suivie d'un nom de fichier; celui-ci contient les commandes FTP Shell ("ftp -i -n -v -s:comm_ftp.txt") 'déclaration de variable Dim IE As Object 'instenciation de Internet Explorer Set IE = CreateObject("internetexplorer.application") 'lancement d'Internet Explorer(IE) avec ouverture de la page web contenant le scipt PHP IE.Navigate (site_web) 'mise en attente de la macro pendant le chargement d'IE et l'exécution du script PHP 'VBA étant asynchrone, on est obligé de recourir à cet artifice pour ne pas exécuter l'instruction suivante ' avant la fin du démarrage de IE Do While IE.readystate <> 4 Loop 'fermeture de IE IE.Quit End Sub Liste des commandes FTP à stocker dans le fichier %TEMP%\comm_ftp.txt cd %TEMP% open site_web.fr user mon_login mon_mot_de_passe put tempo.csv bye commentaires de ces commandes CD = change directory ; %TEMP% est une variable sytème de Windows contenant le chemin complet du dossier temporaire par défaut OPEN = ouverture de la connexion au site FTP USER = votre login (nom) sur le serveur PUT = transfert de la machine locale vers le serveur BYE ou BY fin du programme FTP Listing du script PHP contenu dans la page WEB : <? $i=0; // ouverture du fichier en mode lecture (r = ready) $fichier=fopen("tempo.csv","r+"); // lecture ligne par ligne tant qu'on ne rencontre pas le code: fin de fichier(feof) while(!feof($fichier)) { // l'instruction explode() sépare la ligne en autant de valeurs que de point-virgules rencontrés // fgets() prend les valeurs dans le fichier et lit 128 caractères par ligne (à adapter) // $tableau[] est une variable tableau ou array qui va recevoir ce qui est lu dans le fichier $tableau[$i]=explode(";",fgets($fichier,128)); $i++; } // fermeture du fichier fclose($fichier); $nblignes=$i; //ouverture de la Base de données ; à adapter $bdd = mysql_connect('sql.free.fr','login','mot de passe'); mysql_select_db('nom de la base de données',$bdd); // les valeurs lues dans le fichier sont insérées dans la BDD ligne par ligne // on va "boucler"(for = tant que ...) autant de fois que de lignes trouvées dans le fichier // notez que $i commence à 1 et non à zéro afin de ne pas insérer la 1ere ligne du fichier // pour chaque ligne, on stocke le contenu de chaque champs dans les variables $V // il est en effet impossible de lire une variable tableau[ligne] [colonne] à l'intérieur d'une instruction // mysql_query for ($i=1;$i<$nblignes;$i++) { $v1=$tableau[$i][0]; $v2=$tableau[$i][1]; $v3=$tableau[$i][2]; mysql_query("INSERT INTO nom_de_la_table VALUES ('$v1', '$v2', '$v3')"); } // fermeture de la base de données mysql_close($bdd); ?> OBJECTIF 2 : depuis une page web, envoyer le résultat d'une requête Mysql directement dans Excel (non testé sur Mac) En fait,tout tient dans une seule ligne de code à placer OBLIGATOIREMENT en tête du script PHP. On donne ici un script complet ; il est seulement destiné à illustrer le fonctionnement de cette technique. <? // à elle seule, la ligne suivante suffit à envoyer le résultat du script dans une feuille Excel header("Content-type: application/vnd.ms-excel"); // la ligne suivante est facultative, elle sert à donner un nom au fichier Excel header("Content-Disposition: attachment; filename=toto.xls"); // La suite est une simple requête php-mysql. On interroge la table utilisée dans l'exemple précédent. $bdd = mysql_connect('sql.free.fr','login','mot de passe'); mysql_select_db('nom de la base de données',$bdd); // notez la présence du caractère arobase (@) , en cas d'erreur, // il empêche PHP d'écrire un message d'erreur sur le navigateur $requete=@mysql_query("SELECT * FROM nom_de_la_table"); // on vérifie le contenu de la requête ; if (@mysql_numrows($requete) ==0) { // si elle est vide, on en informe l'utilisateur à l'aide d'un Javascript print "<script> alert('La requête n\'a pas abouti !')</script>"; } // construction du tableau HTML print '<table border=1> <!-- impression des titres de colonnes --> <TR><TD>Eleves</TD><TD>Math</TD> <TD>Francais</TD></TR><TR>'; // lecture du contenu de la requête avec 2 boucles imbriquées; par ligne et par colonne for ($ligne=0 ; $ligne<@mysql_numrows($requete);$ligne++) { for ($colonne = 0;$colonne < 3 ; $colonne++) { print '<TD>' .mysql_result($requete , $ligne,$colonne). '</TD>'; } print '</TR>'; } print '</TABLE>'; mysql_close(); // on informe l'utilisateur de la réussite if (@mysql_numrows($requete) >0) { print "<script> alert('La table est bien mise à jour !')</script>"; } ?> Un autre intérêt de cette technique réside dans le fait que les balises HTML sont respectées par Excel. L'on aura remarqué la syntaxe de la balise <table border=1> ; si border est égal à zéro, la feuille Excel est nue, sans quadrillage. Avec border = 1, le quadrillage est visible. Si border est supérieur à 1, le quadrillage est plus épais. Mais le plus important, c'est l'interprétation des valeurs contenues dans le tableau, notamment les nombres, y compris quand ils ont un format monétaire comprenant un espace. Ils sont vus comme tels alors que ce n'est pas le cas lorsqu'on ouvre une page directement; exemple: fichier | ouvrir | http://adresse.fr/fichier.html Dans ce cas, on obtient le contenu de la page web directement dans la feuille Excel mais les nombres sont lus comme des chaînes de caractères, ce qui interdit de les utiliser dans les calculs ultérieurs (on corrige cela par un copier-collage spécial mais c'est fastidieux!). OBJECTIF 3 Faire une requête PHP-MYSQL depuis une cellule de la feuille Excel Soit la table suivante nommée "xl2mysql2xl" sur le serveur FREE: L'utilisateur Excel veut insérer dans une cellule la note de math de l'élève TOTO. Il faut que le webmestre crée le script PHP-MYSQL suivant: <? $bdd = mysql_connect('sql.free.fr','login','password'); mysql_select_db('nom de la base de données',$bdd); // la requête sélectionne un élève en fonction de son nom contenu dans la variable $nom $requete=@mysql_query("SELECT * FROM xl2mysql2xl WHERE eleves = '$nom' "); // pour cet exemple, on affiche la note de math (2e valeur sur la ligne soit 0,1 puisque les index commencent à zéro print mysql_result($requete , 0,1); mysql_close(); ?> Maintenant que le script existe sur le serveur, on peut intéroger la base de données depuis une cellule Excel: Depuis Excel2000: Menu Données Données externes Nouvelle requête sur le web dans l'espace "parcourir le web", entrer l'url suivie par ?nom=toto ex: http://cherbe.free.fr/divers/req_xl_cellule.php?nom=toto En effet, cette syntaxe permet de passer une variable au script PHP. C'est cette variable qui sera utilisée dans la requête MYSQL On pourrait ajouter d'autres variables, dans l'URL afin de choisir l'affichage d'un autre champ de la table. ATTENTION: cette technique envoie le nom et le contenu des variables en clair dans l'adresse; elles peuvent être interceptées par des personnes mal intentionnées. A éviter en ce qui concerne les données confidentielles ou les bases de données sensibles. Cette page a été vue 71754 fois depuis sa création en décembre 2003