[Excel] Pb import fichier csv
Fermé
willyju
Messages postés
15
Date d'inscription
vendredi 31 décembre 2004
Statut
Membre
Dernière intervention
16 septembre 2015
-
2 août 2006 à 16:23
sebsauvage Messages postés 32893 Date d'inscription mercredi 29 août 2001 Statut Modérateur Dernière intervention 21 octobre 2019 - 4 mars 2009 à 21:42
sebsauvage Messages postés 32893 Date d'inscription mercredi 29 août 2001 Statut Modérateur Dernière intervention 21 octobre 2019 - 4 mars 2009 à 21:42
Bonjour,
J'ai un pb de format de colonne lors d'import de fichier csv sous Excel.
Les cellules de chiffres sont automatiquement affichéss sous le format nombre. Ex : 359078004894815 en 3,59078E+14
J'aimerai que ces colonnes s'affichent en texte
Je précise que je génére le fichier CSV en php donc je peux faire quelque sur le fichier d'origine
Merci d'avance
J'ai un pb de format de colonne lors d'import de fichier csv sous Excel.
Les cellules de chiffres sont automatiquement affichéss sous le format nombre. Ex : 359078004894815 en 3,59078E+14
J'aimerai que ces colonnes s'affichent en texte
Je précise que je génére le fichier CSV en php donc je peux faire quelque sur le fichier d'origine
Merci d'avance
A voir également:
- [Excel] Pb import fichier csv
- Fichier rar - Guide
- Liste déroulante excel - Guide
- Comment réduire la taille d'un fichier - Guide
- Comment ouvrir un fichier epub ? - Guide
- Ouvrir fichier .bin - Guide
7 réponses
JvDo
Messages postés
1978
Date d'inscription
mercredi 27 juillet 2005
Statut
Membre
Dernière intervention
28 septembre 2020
858
12 oct. 2006 à 20:33
12 oct. 2006 à 20:33
Bonsoir,
un simple ="00001111101" devrait aussi faire l'affaire aussi
A+
un simple ="00001111101" devrait aussi faire l'affaire aussi
A+
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 !
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 !
// ****************************************************************** *
// ******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
// ******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
sebsauvage
Messages postés
32893
Date d'inscription
mercredi 29 août 2001
Statut
Modérateur
Dernière intervention
21 octobre 2019
15 662
2 août 2006 à 16:49
2 août 2006 à 16:49
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:
https://sebsauvage.net/python/snyppets/#reading_xls
(L'astuce est indiquée à la fin de l'article)
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:
https://sebsauvage.net/python/snyppets/#reading_xls
(L'astuce est indiquée à la fin de l'article)
meziane20
Messages postés
4
Date d'inscription
jeudi 15 mars 2007
Statut
Membre
Dernière intervention
4 mars 2009
4 mars 2009 à 15:14
4 mars 2009 à 15:14
je rencontre le même problème, et j'ai essai avec .html ; ça marche superb
merci bcp
merci bcp
sebsauvage
Messages postés
32893
Date d'inscription
mercredi 29 août 2001
Statut
Modérateur
Dernière intervention
21 octobre 2019
15 662
>
meziane20
Messages postés
4
Date d'inscription
jeudi 15 mars 2007
Statut
Membre
Dernière intervention
4 mars 2009
4 mars 2009 à 21:42
4 mars 2009 à 21:42
Je suis content d'avoir pu aider :-)
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
sebsauvage
Messages postés
32893
Date d'inscription
mercredi 29 août 2001
Statut
Modérateur
Dernière intervention
21 octobre 2019
15 662
2 août 2006 à 16:53
2 août 2006 à 16:53
Pour illustrer mon propos, enregistre le texte suivante dans un fichier texte:
puis renomme ce fichier en essai.xls et double-clic dessus: Mâââgique !
Excel laisse bien 359078004894815 apparent.
<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.
sebsauvage
Messages postés
32893
Date d'inscription
mercredi 29 août 2001
Statut
Modérateur
Dernière intervention
21 octobre 2019
15 662
2 août 2006 à 16:55
2 août 2006 à 16:55
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...)
(Je ne me rappelle plus du type MIME, mais je vais te retrouver ça...)
sebsauvage
Messages postés
32893
Date d'inscription
mercredi 29 août 2001
Statut
Modérateur
Dernière intervention
21 octobre 2019
15 662
2 août 2006 à 16:55
2 août 2006 à 16:55
Voilà, le type MIME à utiliser est "application/vnd.ms-excel"
willyju
Messages postés
15
Date d'inscription
vendredi 31 décembre 2004
Statut
Membre
Dernière intervention
16 septembre 2015
2 août 2006 à 16:59
2 août 2006 à 16:59
Que dire de plus que "Merci" ...
Ah si, merci beaucoup ;-)
Ah si, merci beaucoup ;-)
sebsauvage
Messages postés
32893
Date d'inscription
mercredi 29 août 2001
Statut
Modérateur
Dernière intervention
21 octobre 2019
15 662
>
willyju
Messages postés
15
Date d'inscription
vendredi 31 décembre 2004
Statut
Membre
Dernière intervention
16 septembre 2015
2 août 2006 à 17:11
2 août 2006 à 17:11
:-)