Forum Clubic

[php] - IE ne télécharge pas mes fichiers excel - générés avec amour par une classe php :/

Voilà sous FX ca fonctionne parfaitement : quand on clique il propose de télécharger le fichier XLS que mon script génère.

IE non :frowning:

Pourtant si je fais “enregistrer sous” avec IE ca fonctionne, mais le clic direct ne donne qu’une page vide :confused: :confused:

je pense que c’est lié aux headers :

header("Content-Type: application/x-msexcel; name=\"$FileCodeLotName\"");
header("Content-Description: inline; filename=\"$FileCodeLotName\"");
$fh = fopen($fname);
fpassthru($fh);
unlink($fname);
?>

Note : si je mets une extension non attribuée dans mon windows, alors IE propose de télécharger et d’ouvrir avec un programme de mon choix.

Comment résoudre ce problème ? Merci par avance les copaings ^^

Le fichier une fois généré est bien valide ? parce que la seule différence est que IE ouvre directement ton fichier en lançant Excel en mode embarqué dans IE.

Tu es sur que ta fonction fpassthru se dispense d’un fclose (et donc eventuel fflush) ? (Note que j’en ai aucune idée vu que je connais pas cette fonction mais c’est bizzare 'absence de fclose dans la logique) car si tu flush pas il manque des données envoyées à la fin et donc c’est normal que IE / Excel arrive pas à le lire …

J’ai fait des tests chez moi ce week end, et premier problème bien plus grave : ca marche pas avec le safe mode ^^

Les fichiers test du mec ne fonctionnent pas non plus tels quels…

En fait je crois que le problème vient d’ailleurs, c’est pas les headers qui posent soucis. Etrangement c’est une fonction php qui pose un soucis avec IE Oo ^^ Je posterais le reste du code, c’est lui qui pose soucis en fait… car techniquement mon script n’a pas besoin de fonctionner avec safe mode ^^

Vla le code d’un exemple, strictement similaire au mien, les requêtes SQL en moins naturellement :slight_smile:

Les problèmes viennent au niveau de la fonction :
$fname = tempanm("/temp/","panes.xls");

Même avec un dossier temp défini, sous easyphp ca a été problématique pour lui faire accepter un dossier pour sauver, par défaut, si le dossier n’existe pas, php() balance dans dans le system root, j’avais 2-3 fichiers sous C:/ :smiley: avec un chemin complet ca a accepté de fonctionner, encore que ca n’utilise pas du tout le “panes.xls” ca génère un truc aléatoire chez moi.

La commande unlink semble elle aussi poser des soucis à IE…

Si qnn a des idées sur le sujet, ca me sauve la vie. Ou alors si vous avez une autre classe d’export pour excel, qui soit libre naturellement… et simple si possible (mes besoins sont réduits, comme mes compétences / connaissances :D) :slight_smile:

Vla le code =>

<?php

# Example of using the WriteExcel module to create worksheet panes.
#
# reverse('©'), May 2001, John McNamara, jmcnamara@cpan.org

# PHP port by Johann Hanne, 2005-11-01

set_time_limit(10);

require_once "class.writeexcel_workbook.inc.php";
require_once "class.writeexcel_worksheet.inc.php";

$fname = tempnam("/tmp", "panes.xls");
$workbook = &new writeexcel_workbook($fname);

$worksheet1 =& $workbook->addworksheet('Panes 1');
$worksheet2 =& $workbook->addworksheet('Panes 2');
$worksheet3 =& $workbook->addworksheet('Panes 3');
$worksheet4 =& $workbook->addworksheet('Panes 4');

# Frozen panes
$worksheet1->freeze_panes(2, 0); # 1 row
$worksheet2->freeze_panes(0, 1); # 1 column
$worksheet3->freeze_panes(1, 1); # 1 row and column

# Un-frozen panes. The divisions must be specified in terms of row and column
# dimensions. The default row height is 12.75 and the default column width
# is 8.43
#
$worksheet4->thaw_panes(12.75, 8.43, 1, 1); # 1 row and column




#######################################################################
#
# Set up some formatting and text to highlight the panes
#

$header =& $workbook->addformat();
$header->set_color('white');
$header->set_align('center');
$header->set_align('vcenter');
$header->set_pattern();
$header->set_fg_color('green');

$center =& $workbook->addformat();
$center->set_align('center');


#######################################################################
#
# Sheet 1
#

$worksheet1->set_column('A:I', 16);
$worksheet1->set_row(0, 20);
$worksheet1->set_selection('C3');

for ($i=0;$i<=8;$i++) {
    $worksheet1->write(0, $i, 'Scroll down', $header);
}

for ($i=1;$i<=100;$i++) {
    for ($j=0;$j<=8;$j++) {
        $worksheet1->write($i, $j, $i+1, $center);
    }
}



$workbook->close();

header("Content-Type: application/x-msexcel; name=\"example-panes.xls\"");
header("Content-Disposition: inline; filename=\"example-panes.xls\"");
$fh=fopen($fname, "rb");
fpassthru($fh);
unlink($fname);

?>

Tu sais que le php est executé sur un serveur et donc dépends pas du navigateur :neutre:*

Essaie à tout hasard un fclose derrière ton unlink.

Ben vouais je sais, mais ie me retourne une erreur à ce niveau, et pas FX :confused: Oo

Ton serveur PHP est sous Windows ?
Dans ce cas fait un fopen(‘fichier’, ‘rb’); (d’ailleurs ça rendra ton code plus portable :wink: )

vouais je suis sous win, easyphp (voui caca je sais ^^)

c’est un RB à la base, j’avais testé d’autres options voir si ca allait mieux).

Laisse rb alors sinon tu vas avoir des problèmes :slight_smile:

t’inquiètes j’ai remi ca en place :slight_smile:

ok alors au niveau de mon soucis, je pense que c’est fondamentalement la fonction tempnam qui m’emmerde…

de base c’est genre :

$fname = tempnam(’/tmp’,‘temp.xls’);

et ensuite à la fin :

$fh=fopen($fname, "rb");
fpassthru($fh);
unlink($fname);

Il semble que la première ligne ne fonctionne pas comme il faut : il me stocke les fichiers sur system root => c:\ j’ai essayé diverses variations pour l’url où stocker le fichier mais on dirait que ca ne marche pas… :confused:

j’ai bien créé le dossier tmp en “dessous” du niveau où se trouve mon script, donc logiquement ca devrait marcher, sauf que non :smiley:

Que faire ? Help ^^

essaie tempnam(getenv(‘TEMP’), ‘…’) à tout hasard :neutre:

ok ca utilise le dossier temp par défaut du système c ca ?

alors ca me donne >

fpassthru-) >> supplied argument is not a valid stream ressource
unklink(c:\docume~1\…\locals~1\temp\… permission denied

gallère :frowning:

je peux pas “temper” ca dans un dossier sous mon script, c’est plus simple je trouve :confused:

ok alors vérification faite : un fichier de la bonne taille est bien créé dans le dossier en question, mais également un sous c: et dont la taille est 0, ils n’ont pas le même nom…

et ca fait donc les erreurs précisées au dessus :slight_smile:

remoi :slight_smile:

alors essayé ca :

$fname = tempnam(‘d:\Sites\test\tmp’,‘temp’)

Et ca crée donc bien un fichier dans le dossier en question, et toujours son homologue dans le dossier c:\ a taille zéro :confused: :frowning:

mozerfoc !

Aller je reposte le code, à force de tout changer on va plus savoir où ca en est =>

<?php
include("global.inc.php");
require_once "class.writeexcel_workbook.inc.php";
require_once "class.writeexcel_worksheet.inc.php";

// BDD stuff / pas encore créé, on verra après :)

$query = "SELECT Chassis, Montant, Avenant, Nature, Lieu, Details, MarqueurV, vehicules.idLot FROM vehicules INNER JOIN lots ON vehicules.idLot = lots.idLot AND lots.idLot = '$_GET[idLot]'";
$requeteID = mysql_query($query);

// Fin des trucs BDD

$FileCodeLotName = ereg_replace(' ','_',$NomClient.'-'.$codeLot.'.xls');
$fname = tempnam('d:\Sites\yyyyyy\tmp', 'xls');
$workbook =& new writeexcel_workbook($fname);
$worksheet =& $workbook->addworksheet("$codeLot");
$worksheet->set_column('A:A', 20);
#######################################################################
#
# Ecriture du code Lot, du NomClient et du Transporteur : A1 > G1
#
//$worksheet->set_column('A:G', 15);
$heading  =& $workbook->addformat(array(
  bold	=> 1,
  color   => 'blue',
  size    => 12,
  merge   => 1,
  border => 2,
  ));

$headings = array("$codeLot",'',"$NomClient",'','','','test');
$worksheet->write_row('A1', $headings, $heading);

#######################################################################
#
# 
#
$text_format =& $workbook->addformat(array(
	bold => 1,
	italic => 1,
	color => 'white',
	size => 10,
	border => 2,
	align => 'center',
	fg_color => 'grey'));
$tableHeader = array('VIN','Montant','Avenant','Nature','Lieu','Détails','Etat');
$worksheet->write_row('A2',$tableHeader,$text_format);

$text_format2 =& $workbook->addformat(array(size=>8,align=>'center',border=>1));

$i=2;
while ($data = mysql_fetch_assoc($requeteID))
{
	$i = $i + 1;
	$MontantTotal = $MontantTotal + $data['Montant'];
	$chassisRow = array("$data[Chassis]","$data[Montant]","$data[Avenant]","$data[Nature]","$data[Lieu]","$data[Details]","$data[MarqueurV]");
	$worksheet->write('A'.$i,$chassisRow,$text_format2);
}
$i = $i + 1;
$LastRow = array("Total","$MontantTotal",'','',"$i","véhicules","");

$worksheet->write_row('A'.$i,$LastRow,$heading);
// Fin de la création du fichier excel
$workbook->close();
header("Content-Type: application/x-msexcel; name=\"example-demo.xls\"");
header("Content-Disposition: inline; filename=\"example-demo.xls\"");
$fh=fopen($fname, "rb");
fpassthru($fh);
unlink($fname);

?>

Tu as pas mis fread au lieu de fpasstrhu ?

j’ai édité :slight_smile: j’avais pas remis ca comme au départ :confused:

Je crois que je vais chercher une autre classe, car ca me génère toujorus 2 fichiers à 2 endroits ce qui doit être dû à un morceau de code dans la classe elle même…

Une suggestion ?

$fname = tempnam('d:\Sites\yyyyyy\tmp', 'xls');

Faut pas doubler les backslash ? C’est quoi la différence entre quote et double quote en php ?

heu… aucune idée :smiley: mais ca fonctionne parce que le fichier est bien créé dans le dossier prévu à cet effet avec cette écriture, alors que ne marche pas du tout avec les autres :confused: