|
|
|
| [Excel] Pb import fichier csv par willyju |
mercredi 2 août 2006 à 16:23:21 |
Tu ne peux pas.
Par défaut, Excel considère que chaque cellule est de type "Général", donc il essai de "deviner" le contenu de la cellule (de manière particulièrement stupide, il faut l'avouer). Il y a 2 solutions à ton problème: - renommer le fichier en .txt, puis aller dans Excel > menu fichier > ouvrir et lors de l'import, spécifier le type de chaque colonne. (Pénible). ou - générer un tableau HTML que tu servira au navigateur sous l'extension .xls. Excel acceptera d'ouvrir bêtement le fichier .html comme si c'était un XLS. Et en ajoutant certains attributs HTML spécifiques à Excel, on peut forcer le type des cellules. Voir mon article: http://sebsauvage.net/python/snyppets/#reading_xls (L'astuce est indiquée à la fin de l'article) |
Pour illustrer mon propos, enregistre le texte suivante dans un fichier texte:
<style><!--.tt{mso-number-format:"\@";}--></style>
<table>
<tr><td>toto</td><td>titi</td></tr>
<tr><td class="tt">359078004894815</td><td>tata</td></tr>
</table>
puis renomme ce fichier en essai.xls et double-clic dessus: Mâââgique ! Excel laisse bien 359078004894815 apparent. |
Ah... n'oublie pas qu'il faudra servir le fichier au client avec le bon type MIME (Content-type).
(Je ne me rappelle plus du type MIME, mais je vais te retrouver ça...) |
Voilà, le type MIME à utiliser est "application/vnd.ms-excel"
|
Voici la bidouille que j'utilise pour forcer l'interprétation d'un nombre en texte dans un fichier CSV :
Dans le fichier CSV constitué, il suffit de placer ton nombre dans une fonction "texte" de Excel. Exemple : TOTO;=MAJUSCULE("0000111111"); Excel affichera TOTO 0000111111 Ca paraît idiot mais ca marche ! |
Bonsoir,
un simple ="00001111101" devrait aussi faire l'affaire aussi A+ |
// ****************************************************************** *
// ******Lire un csv et l'importer dans la base de donnée * // ******2 fichiers nécessaires : formulaire.php et ajouter.php * // *********l'un pour choisir le fichier csv et l'autre pour * // ***************enregistrer dans la bdd * **** le fichier csv doit etre du type ci dessous * *** link,email * *** www.mafonction.com,axel@tueslemeilleur.com * *** www.csvfacile.com,csv@insert.com * ///************************************************************ ********* //formulaire.php <form action="ajouter.php" method="post" enctype="multipart/form-data" name="form1"> <p><input type="file" name="file" /></p> <input type="submit" name="Submit" value="Submit"> </form> ________________________________________________ //ajouter.php //lire un csv et ajouter le couple email,url dans la base de donnee if (isset($_FILES['file'])) { $file = $_FILES['file']['tmp_name']; $handle = fopen($file,'r'); $row = 1; $handle = fopen("$file", "r"); while (($data = fgetcsv($handle, 4096, ",")) !== FALSE) { $num = count($data); //echo "<p> $num fields in line $row: <br /></p>\n"; $row++; for ($c=0; $c < $num; $c++) { //je met les donnees en miniscule et detecte si l'email est dans la colonne 0 ou 1 //meme chose pour l'url //je les transformes en miniscule $data[1]=strtolower($data[1]); $data[0]=strtolower($data[0]); //je controle l'entete du csv if ($data[1]=='emails' && $data[0] == 'links' ) $mode=1 ; if ($data[1]=='email' && $data[0] == 'link' ) $mode=1 ; if ($data[1]=='email' && $data[0] == 'links' ) $mode=1 ; if ($data[1]=='emails' && $data[0] == 'link' ) $mode=1 ; ////meme chose pour le mode 2 il faut changer $data[0] par $data[1] ///c'est à dire si l'on souhaite avoir email,link, il faut recopier le ///meme code et changer tous les $data[0] par $data[1] et $data[1] par $data[0] } if ($mode==1) { //je controle l'email $avant_arobase = '[-a-z0-9!#$%&\'*+\\/=?^_`{|}~]'; $nomdudomaine = '([a-z0-9]([-a-z0-9]*[a-z0-9]+)?)'; $caract_allow_before_arobase = '/^' . $atom . '+' . '(\.' . $avant_arobase . '+)*' . '@' . '(' . $nomdudomaine . '{1,63}\.)+' . $domain . '{2,63}$/i'; // test de l'adresse e-mail if (preg_match($caract_allow_before_arobase, $data[1])) { } else { $data[1] = NULL ; } $data[1]=strtolower($data[1]); $data[0]=strtolower($data[0]); //je controle tous les donnees s'il s'agit bien d'un url et d'un email ///dans le cas contraire, ils seront filtrées $point = strpos($data[0],"."); if($point=='') { $data[0]=NULL; } $point = strpos($data[0],"@"); if($point=='') { $data[0]=$data[0]; } else { $data[0]=NULL; } if ( $data[1] != NULL && $data[0] != NULL ) { $numberdownload=$numberdownload+1; $marequete = "INSERT INTO matable SET monurl ='$data[0]' , monemail ='$data[1]' "; $resultat=mysql_query ($marequete) or die (mysql_error()); } } } //if ( $resultat ){ echo "<p> insertion with Succesfully </p> <p> //" ; //si des adresses ont ete enregistrer if ($numberdownload>0){ echo " <p>You have downloaded $numberdownload combinaisons </p>"; echo "<p>The list Id is : $rowIdListNext </p>"; } ///si aucune adresse a ete enregistrer if ($existadresse==0 && $numberdownload==0) { echo " <p> Error .. Your Csv file has a problem.</p>"; echo " <p> Please notice that your csv file has a header</p>"; } //si les adresses existe deja if ($existadresse>0 ) { echo " <p>$existadresse combinaisons already exist! </p>"; } //renvoie à la page qui a valider le formulaire...c'est à dire vers formulaire.php $departure=$_SERVER['HTTP_REFERER'];//recover the adress which the user come from echo "<meta HTTP-EQUIV=\"Refresh\" content=\"5;URL=$departure \"> " ; Configuration: Windows XP Firefox 2.0.0.6 Configuration: Windows XP Firefox 2.0.0.6 |
| 05/11 15h31 | Programme vbsur importation fichiers CSV | Programmation | 05/11 15h31 | 0 |
| 30/07 21h34 | import fichier .csv automatique sur access | Windows | 30/07 21h34 | 0 |
| 13/06 09h50 | Importation fichier csv dans mysql (php) | Programmation | 30/08 00h29 | 1 |
| 21/05 18h19 | importer fichier Excel vers BDD Access | Programmation | 22/05 09h25 | 1 |