[php/sql] export table sql vers csv/xls [Fermé]

Signaler
-
 Kyrliann -
Bonjour à tous. Je chercher à exporter ma base sql vers un fichier xls/csv.
J'ai réussi à coder quelque chose qui créé un fichier, mais rien n'est enregistré.
Je n'arrive pas à comprendre pourquoi ...

Merci de votre aide !




<?php

include("../include/database.php");
$db = mysql_connect($server, $user, $password); // connexion à la base
mysql_select_db($database); // sélection de la base
$req = mysql_query("SELECT * FROM liste"); // on sélectionne les enregistrements
$res = mysql_numrows($req); // on compte le nombre de résultats

$file = ("bdd_fichier.xls"); // le fichier doit déjà exister
if(!$myfile = fopen($file, "w")) //on ouvre le fichier
{
print("erreur: ");
print("'$filename' n'existe pas!\n");
exit;
}

$email=$liste['email'];

WHILE($res!=$i) // 5. chaque fois que "$res" est dif. de "$i", donc qu'il y a un enreg.

{
$numero = mysql_result($req,$i,$email); // on récupère les champs




//ecriture
fputs($myfile,"$email\t $name\n"); //on insère une tabulation \t pour changer de colonne et un retour chariot \n pour changer de ligne


$i++; // 8. on ajoute un au compteur et on retourne à WHILE
}

//fermeture fichier
fclose($myfile); //on ferme le fichier
echo "<center><h2>La table a été sauvegardée...</h2></center>";

mysql_close(); // 9. on ferme la connexion
?>
<form name="form0">
<center><br><br><input type="button" value="Fermer" onClick="self.close()" name="button3"></center>
</form> 
 
 

7 réponses

Salut, moi j'avais trouvé un code très simple. Si ça peut aider je le met :
<?php
	include('../conn_deconn/session.php');
	include '../bdd/connexion_bdd.php';

//Premiere ligne ; nom des champs :
$xls_output = "MATRICULE;NOM;PRENOM";
$xls_output .= "\n";

//Requete SQL
$query='SELECT matricule, nom, prenom FROM une_table';
$result = mysql_query($query) or die(mysql_error());

//Boucle sur les resultats
while($row = mysql_fetch_array($result))
{
	$xls_output .= $row[0] . ";" . $row[1] . ";" . $row[2];
	$xls_output .= "\n";
}

header("Content-type: application/vnd.ms-excel");
header("Content-disposition: attachment; filename=export_" . date("d-m-Y").".csv");

print $xls_output;

exit;
?>

Voila, on créé une variable "$xls_output" à laquelle on commence par attribuer les premiers champs du tableau (les titre des colonnes quoi), puis on créé la requête et on l'exécute. Dans le "while" on parcoure cette requête et on complète pour chaque enregistrement la variable "$xls_output". Et à chaque fois que l'ont complete cette variable, on met des ";" entre chaque valeurs et on termine la ligne par un "\n".
Ceci va permettre de détecter les champs car ils serons situés entre les ";", mais aussi de détecter quand une lignes sera terminée grâce à l'"\n".
Enfin, grâce au "header", on exporte le tout dans un fichier qui s'appellera "export_la_date_du_jour.csv".

Pour ça fonctionne, il faut bien sur faire gaffe de ne pas trouver de ";" ou d'"\n" dans les valeurs que tu rentres...
Pour ça j'ai créé une fonction, et je l'appelle pour tous les enregistrements que je rentre dans mon fichier :
function lisserChaineCarac($chaineCarac)
{
	$chaineCarac = str_replace(';',',',$chaineCarac);
	$chaineCarac = str_replace(CHR(13),' ',$chaineCarac);
	$chaineCarac = str_replace(CHR(10),' ',$chaineCarac);
	return $chaineCarac;
}

Il doit déjà en avoir des toutes faite mais bon...
7
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 65492 internautes nous ont dit merci ce mois-ci

J'ai l'impression que tu as un soucis sur ton parcours et sur ton insertion. De plus, tu devrais utiliser des "," pour changer de colonne et non des "\t"

voici un exemple de ce que tu peux faire (dans mon cas j'ai utilisé le framework Zend) :

$file = fopen("[path]/nomFichier.csv", "w"); 
 		if (!$file)
 		{
			echo "<p>Impossible d'ouvrir un fichier distant en écriture.\n";
			exit;
 		}
                $stmt = $db->query($sql);
		$result = $stmt->fetchAll();
		$db->closeConnection();
		
		
	  	$elems = count($result);
	  	$i = 0;
		while ($i < $elems)
		{
			$row = $result[$i];
			foreach ($row as $e)
			{
                                //$str est équivalent à "$e,"
                                //on récupère l'élément $e puis on place une "," derriere.
                                // les \"  insérés servent à échapper les \n qu'il porrait y avoir dans un champ texte de la                                                table par exemple
				$str = "\"$e\",";
				fwrite ($file, $str);
			}	
			fwrite ($file, "\n");
			$i++;
		}
		fclose($file);
	}
Messages postés
6
Date d'inscription
mardi 21 octobre 2008
Statut
Membre
Dernière intervention
28 décembre 2009
1
Si je pense, mais pour le lire avec Excel ça va être galère je crois...
lolol j'ai testé quand même par curiosité, je pensais qu'il n'allait pas enlever les backslashs en insérant le texte ... en fait il fait pire, il enlève le " ; " et laisse le backslash =o))
Messages postés
1
Date d'inscription
mardi 8 avril 2008
Statut
Membre
Dernière intervention
8 avril 2008

personne pour ce ptit problème ? j'arrive vraiment pas à trouver ...
Si tu as réussis, je veux bien le code ! Je galere la dessus !
Merci
Ca ne prendrait pas si on utilise le caractère d'échappement pour ces caractères spéciaux ? \; par ex...