Précédent   Forum des professionnels en informatique > PHP > Bibliothèques et frameworks > Bureautique
Bureautique Forum d'entraide sur la gestion dynamique de documents de bureautique (Word, Excel, OpenOffice...) avec PHP. Avant de poster -> Cours Excel, FAQ OpenXML, FAQ OpenDocument
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 22/06/2007, 11h19   #1
Membre du Club
 
Inscription : juin 2005
Messages : 220
Détails du profil
Informations forums :
Inscription : juin 2005
Messages : 220
Points : 47
Points : 47
Par défaut Sauvegarder avec PHP_WRITEEXCEL

Bonjour tout le monde !

Je viens de trouver une librairie vraiment sympa en php, il s'agit de php_writeexcel.

J'ai fait un script en PHP me générant un fichier Excel, quand je clique sur un lien permettant de lancer le script j'ai une fenêtre me proposant d'ouvrir, d'enregistrer (le fichier excel généré) ou d'annuler.

J'aimerai que le lancement de ce script sauvegarde le fichier à un emplacement précis du serveur mais j'ai pas trouvé d'exemple faisant cela.

Quelqu'un sait-il comment faire cela ?

D'avance un grand merci et bonne fin de semaine !!
soad029 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/06/2007, 13h22   #2
Membre actif
 
Avatar de JmL40
 
Inscription : mai 2007
Messages : 310
Détails du profil
Informations personnelles :
Âge : 26

Informations forums :
Inscription : mai 2007
Messages : 310
Points : 191
Points : 191
Envoyer un message via MSN à JmL40
Bonjour,

J'utilise moi aussi les classes de phpwriteexcel. Cependant j'ai quelques problèmes à ce niveau.

Tout d'abord, je pense que si tu veux sauvegarder ton fichier Excel tu dois spécifier le repertoire d'enregistrement à la création de ton fichier, ici par exemple :

Code :
1
2
3
4
 
$fname = tempnam("/tmp", "simple.xls");
$workbook = &new writeexcel_workbook($fname);
$worksheet = &$workbook->addworksheet();
Cependant, je souhaiterai savoir quelle est la structure de ton code pour afficher ta page excel, car j'ai bien utilisé la librairie phpwriteexcel mais mon affichage a lieu une fois sur deux et je ne comprend pas pourquoi.

Je te présente le code que j'ai implémenté :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
 
<?php
 
// information pour la connection à le DB
$host = 'localhost';
$user = 'root';
$pass = '';
$db = 'masdb';
 
// connection à la DB
$link = mysql_connect ($host,$user,$pass) or die ('Erreur : '.mysql_error() );
mysql_select_db($db) or die ('Erreur :'.mysql_error());	
 
// on selectionne les enregistrements
$sql = "SELECT * From TbLigIdentite"; 
$req = mysql_query($sql,$link); 
$total = mysql_num_rows($req);
 
set_time_limit(10);
 
require_once "class.writeexcel_workbook.inc.php";
require_once "class.writeexcel_worksheet.inc.php";
 
$fname = tempnam("/tmp", "simple.xls");
$workbook = &new writeexcel_workbook($fname);
$worksheet = &$workbook->addworksheet();
 
$i=0;
while ($resultat = mysql_fetch_array($req)){
   	$worksheet->write(($i+2), 0, $resultat["NomLignee"]);
   	$worksheet->write(($i+2), 1, $resultat["CatalogueLig"]);
  	$i=$i+1;
}
 
$workbook->close();
 
header("Content-Type: application/x-msexcel; name=\"example-simple.xls\"");
header("Content-Disposition: inline; filename=\"example-simple.xls\"");
$fh=fopen($fname, "rb");
fpassthru($fh);
unlink($fname);
 
?>
D'après ce que j'ai fait, cela marche sous FIREFOX mais une fois sur deux sur IE. Bref comparons ...

De plus est ce que tu sais comment intégrer juste une feuille excel genre un graphique ou un tableau excel dans la page sans effectuer une ouverture d'excel comme c'est le cas dans le script ci-dessus.

MERCI

Cordialement
JmL40 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/06/2007, 15h13   #3
Membre du Club
 
Inscription : juin 2005
Messages : 220
Détails du profil
Informations forums :
Inscription : juin 2005
Messages : 220
Points : 47
Points : 47
Salut !!

Bah pour tout te dire je fais exactement le même affichage que toi, à savoir :

Code :
1
2
3
4
 
header("Content-Type: application/x-msexcel; name=\"example-simple.xls\"");
header("Content-Disposition: inline; filename=\"example-simple.xls\"");
$fh=fopen($fname, "rb");
Et ça marche très bien, as-tu tester les exemples présents sur le site où tu as téléchargé cette librairie ?

Sinon pour ta deuxième question, il suffit de mettre en commentaire ces mêmes lignes

Code :
1
2
3
4
 
header("Content-Type: application/x-msexcel; name=\"example-simple.xls\"");
header("Content-Disposition: inline; filename=\"example-simple.xls\"");
$fh=fopen($fname, "rb");
Par contre tu seras confronté au même problème que moi, à savoir comment le sauvegarder sans proposé de l'ouvrir. J'ai déjà pensé à ta méthode, j'ai spécifié le chemin :
[CODE]$fname = tempnam("/home/srv/www/MaJBdD", "merge2.xls");[CODE]

puis supprimer les lignes de code qui supprime le fichier (car normalement c'est un fichier temporaire, une fois l'ouverture effectué le programme le supprime)

Code :
1
2
3
4
 
$fh=fopen($fname, "rb");
fpassthru($fh);
unlink($fname);
et là je me retrouve avec un fichier dans le bon répertoire mais du type : merge2.xlsWd8GaJ donc illisible
soad029 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/06/2007, 16h28   #4
Membre actif
 
Avatar de JmL40
 
Inscription : mai 2007
Messages : 310
Détails du profil
Informations personnelles :
Âge : 26

Informations forums :
Inscription : mai 2007
Messages : 310
Points : 191
Points : 191
Envoyer un message via MSN à JmL40
Re bonjour,

Il suffit juste de mettre ca en commentaire :

Code :
1
2
3
4
 
header("Content-Type: application/x-msexcel; name=\"example-simple.xls\"");
header("Content-Disposition: inline; filename=\"example-simple.xls\"");
$fh=fopen($fname, "rb");
Je viens de tester et cela ne marche pas du tout !

Pour la sauvegarde, je ne sais pas du tout comment faire, je préfère oublier pour le moment car je suis occupé à rendre dynamique l'affichage avec phpwriteexcel et c'est pas du gateau !

Est-ce-que tu crois que cette boucle est juste ?????

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
 
// J'ai integrer tous les champs de ma requete à afficher 
// dans un tableau, $col est la taille du tableau
 
$i=0;
while($resultat = mysql_fetch_array($sql)){
 
for($j=0;$j<=$col;$j++){
 
$worksheet->write($i,$j,$resutat["$champs[$j]"]);
}
$i++;
}
Logiquement le code ci-dessus doit afficher de la même manière que ca :

Code :
1
2
3
4
5
6
7
8
 
$i=0;
while($resultat = mysql_fetch_array($req)){
worksheet->write($i,1,$resultat["var1"]);
worksheet->write($i,2,$resultat["var2"]);
worksheet->write($i,3,$resultat["var3"]);
$i++
}
La deuxième solution fonctionne mais pas la première pourquoi .....;

Au fait pour l'affichage sans ouvrir excel regarde cette exemple :

http://iut-adour.univ-pau.fr/anciens...es&menu=menu_2

>> Choisir une promotion sur le site

Tiens moi au courant,

Merci
JmL40 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/06/2007, 16h29   #5
Membre actif
 
Avatar de JmL40
 
Inscription : mai 2007
Messages : 310
Détails du profil
Informations personnelles :
Âge : 26

Informations forums :
Inscription : mai 2007
Messages : 310
Points : 191
Points : 191
Envoyer un message via MSN à JmL40
Il nous faudrait un TUTAUX pour PHPWRITEEXEL ...
JmL40 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/06/2007, 17h19   #6
Membre actif
 
Avatar de JmL40
 
Inscription : mai 2007
Messages : 310
Détails du profil
Informations personnelles :
Âge : 26

Informations forums :
Inscription : mai 2007
Messages : 310
Points : 191
Points : 191
Envoyer un message via MSN à JmL40
Enfin mon export fonctionne bien je vous communiquerai le code ce soir ! Je sors du bureau CONFIANT ...
JmL40 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/06/2007, 12h08   #7
Membre actif
 
Avatar de JmL40
 
Inscription : mai 2007
Messages : 310
Détails du profil
Informations personnelles :
Âge : 26

Informations forums :
Inscription : mai 2007
Messages : 310
Points : 191
Points : 191
Envoyer un message via MSN à JmL40
Je vous donne un exemple d'exporation de données vers excel, la feuille excel étant intégrée dans une page web :

Voici le script :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
 
<?php
 
//FICHIER D'EXPORTATION DES DONNEES VERS EXCEL
 
//INCLUSION DU FICHIER DE CONNEXTION BD
require("connect.php");
 
//TABLEAU CONTENANT LES CHAMPS DE LA REQUETE (CHAMPS A AFFICHER)
$champs = array("champ1","champs2" ...);
 
$taille = count($champs);
 
//REQUETE DE SELECTION DES DONNEES
	$select = 'SELECT champ1, champ2 FROM TABLE'; 
 
//CONNECTION A LA BASE DE DONNEES
	$result = mysql_query($select,$link) or die ('Erreur : '.mysql_error() );
	$total = mysql_num_rows($result);
 
//INCLUSION DE LA CLASSE PHPWRITEEXCEL	
	require_once "Classes/class.writeexcel_workbook.inc.php";
	require_once "Classes/class.writeexcel_worksheet.inc.php";
 
//CREATION DU FICHIER TEMPORAIRE EXCEL + INSTANCIATION D'UN NOUVEL OBJET DE LA CLASSE PHPWRITEEXCEL
	$fname = tempnam("/tmp", "simple.xls");
	$workbook = &new writeexcel_workbook($fname);
	$worksheet = &$workbook->addworksheet();
 
//ECRITURE SUR LE FICHIER EXCEL GRACE A LA METHODE WRITE DE PHPWRITEEXCEL	
 
	//ECRITURE DE LA PREMIERE LIGNE (IDENTIFIANT DE CHAQUES CHAMPS)
	for($j=0;$j<=($taille-1);$j++){
		$worksheet->write(1,$j,$champs[$j]);
	}
 
	//ECRITURE DES DONNEES EN FONCTION DES CHAMPS OU COLONNES
	$i=2;
    while($row = mysql_fetch_array($result)) {
        for($j=0;$j<=($taille-1);$j++){
				$worksheet->write($i,$j,$row["$champs[$j]"]);
		}
	$i++;	
    }
 
//FERMETURE DU CLASSEUR TEMPORAIRE EXCEL
	$workbook->close();
 
//INTEGRATION DU WORKBOOK EXCEL DANS LA PAGE WEB GRACE A LA FONCTION HEADER DE PHP
	header("Content-Type: application/x-msexcel; name=\"example-simple.xls\"");
	header("Content-Disposition: inline; filename=\"example-simple.xls\"");
 
//OUVERTURE DU FICHIER EXCEL
	$fh=fopen($fname, "rb");
	fpassthru($fh);
 
//DESTRUCTION DE CE FICHIER
	unlink($fname);
 
?>
Il faut juste adapter la première partie du code, a savoir modifier votre requête et mettre en forme le tableau en fonction de votre requete. Le reste ne change pas normalement !

A NOTER IL VOUS FAUT UTILISER LA CLASSE PHPWRITEEXCEL !

Voila

Cordialement
JmL40 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/06/2007, 13h52   #8
Membre du Club
 
Inscription : juin 2005
Messages : 220
Détails du profil
Informations forums :
Inscription : juin 2005
Messages : 220
Points : 47
Points : 47
Merci pour ces infos !!

Je reviens à mon post de départ, quelqu'un sait comment sauvegarder le fichier en locale et non le proposé en téléchargement ?

D'avance merci.
soad029 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/07/2007, 09h59   #9
Membre du Club
 
Inscription : juin 2005
Messages : 220
Détails du profil
Informations forums :
Inscription : juin 2005
Messages : 220
Points : 47
Points : 47
Je me permets de faire remonter un peu le sujet car je n'ai toujours pas trouver, j'ai tapé "php writeExcel + saveAs" dans google mais rien ne répondant à ma requête, pourtant j'ai lu dans un article que cette librairie permettait de générer 200 fichiers en je sais plus combien de seconde..

Ces 200 fichiers sont bien sauvegardés quelques part... Mais comment ??
soad029 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/07/2007, 10h02   #10
Membre Expert
 
Inscription : janvier 2005
Messages : 2 288
Détails du profil
Informations forums :
Inscription : janvier 2005
Messages : 2 288
Points : 2 287
Points : 2 287
Dans le code de Jml40 on dirait que le fichier est écrit sur le disque (dans le dossier temp mais tu dois pouvoir le mettre ailleurs). Ensuite les headers sont utilisés, on relit le fichier avant de le supprimer.

Donc si tu ne veux pas le proposer en téléchargement je pense que tu dois juste supprimer la partir avec les headers et la suppression et modifier le dossier de sauvegarde du fichier.
koopajah est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/07/2007, 12h24   #11
Membre du Club
 
Inscription : juin 2005
Messages : 220
Détails du profil
Informations forums :
Inscription : juin 2005
Messages : 220
Points : 47
Points : 47
En effet, ça marche !!

En faite il faut faire ce que tu as dit koopajah et remplacer :

Code :
$fname = tempnam("/home/passionbeaute.net/www/", "bigfile.xls");
par

Code :
$fname = "/home/srv/www/bigfile.xls";
Car la fonction tempnam utilise des caractères aléatoires après le nom du fichier donc inutilisable

Merci pour le tuyaux koopajah !!
soad029 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 12h11.


 
 
 
 
Partenaires

Hébergement Web