80 votes

phpexcel à télécharger

Bonjour, je suis nouveau dans Phpexcel, et je me demandais s'il y avait un moyen d'envoyer le fichier excel que j'ai créé au client pour le télécharger sans le sauvegarder sur mon serveur ou de le supprimer juste après qu'il l'ait téléchargé.

J'essaie de créer un "bouton d'exportation" sur une page qui donnera à l'utilisateur une "pop-up" avec l'Excel qu'il veut et que je viens de créer.

Maintenant, après avoir créé la table, je fais :

$objXLS->getActiveSheet()->getColumnDimension("A")->setAutoSize(true);
$objXLS->getActiveSheet()->getColumnDimension("B")->setAutoSize(true);

$objXLS->getActiveSheet()->setTitle('Test Stats');

$objXLS->setActiveSheetIndex(0);

$objWriter = PHPExcel_IOFactory::createWriter($objXLS, 'Excel5');
$objWriter->save(__DIR__."/test1.xls");

mais cela l'enregistre sur mon serveur

Merci.

171voto

hakre Points 102271

Au lieu de le sauvegarder dans un fichier, sauvegardez-le dans php://output Ds :

$objWriter->save('php://output');

Cela permettra de l'envoyer tel quel au navigateur.

Vous voulez ajouter un peu de en-têtes Ds d'abord, comme c'est souvent le cas lors du téléchargement de fichiers, afin que le navigateur sache de quel type de fichier il s'agit et comment il doit être nommé (le nom du fichier) :

// We'll be outputting an excel file
header('Content-type: application/vnd.ms-excel');

// It will be called file.xls
header('Content-Disposition: attachment; filename="file.xls"');

// Write file to the browser
$objWriter->save('php://output');

Faites d'abord les en-têtes, puis la sauvegarde. Pour les en-têtes excel voir aussi la question suivante : Définition du type de mime pour un document Excel .

1 votes

J'obtiens un fichier à télécharger mais il ne correspond pas à ce que j'ai créé et lorsque je fais $objWriter->save('php://output'), cela perturbe ma page d'accueil.

2 votes

Veillez à ce que la seule chose que vous affichez sur cette page soit la sortie des deux pages de l'application header et les ->save() action. Vous devez choisir entre a) l'affichage d'une page o b) proposer un téléchargement. Les deux ne fonctionnent pas facilement avec un seul script. Vous pouvez cependant créer un script pour le téléchargement et un pour la page et lorsque la page script a été exectuée, rediriger vers le script de téléchargement qui fera que le navigateur proposera le dialogue save-as.

0 votes

Mon problème est que j'utilise joomla et je ne trouve pas le moyen de le charger à partir d'une page vide. à chaque fois que j'essaie, j'obtiens la page joomla vide avec les menus et tout le reste. savez-vous où je pourrais trouver une réponse à ce problème ? je ne veux pas spammer stack overflow...

22voto

matino Points 7349
$excel = new PHPExcel();
header('Content-Type: application/vnd.ms-excel');
header('Content-Disposition: attachment;filename="your_name.xls"');
header('Cache-Control: max-age=0');

// Do your stuff here

$writer = PHPExcel_IOFactory::createWriter($excel, 'Excel5');

// This line will force the file to download
$writer->save('php://output');

0 votes

Bonjour et merci pour la réponse. J'ai mis la ligne $writer->save('php://output') ; et le fichier n'est pas téléchargé, il s'affiche sur la page. Savez-vous pourquoi cela se produit ?

0 votes

Avez-vous également réglé les en-têtes ?

0 votes

J'essaie de créer un PPT à l'aide de PHPPowerpoint. J'ai suivi exactement les étapes mentionnées, mais j'ai changé le nom du fichier. MIME Type à application/vnd.openxmlformats-officedocument.presentationml‌​.presentation il télécharge le fichier sur mon système mais dit que File can't be opened . Le fichier fonctionnait lorsque le code l'écrivait sur le serveur.

6voto

POUR UTILISER XLSX

SET IN $xlsName de XLSX avec l'extension. Exemple : $xlsName = 'teste.xlsx' ;

$objPHPExcel = new PHPExcel();

$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');
header('Content-Type: application/vnd.ms-excel');
header('Content-Disposition: attachment;filename="'.$xlsName.'"');
header('Cache-Control: max-age=0');
$objWriter->save('php://output');

POUR UTILISER XLS

SET IN $xlsName nom de XLS avec l'extension. Exemple : $xlsName = 'teste.xls' ;

$objPHPExcel = new PHPExcel();

$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');
header('Content-Type: application/vnd.ms-excel');
header('Content-Disposition: attachment;filename="'.$xlsName.'"');
header('Cache-Control: max-age=0');
$objWriter->save('php://output');

3 votes

PSI : Le format XLS est défini par défaut comme 'Excel5' et XLSX est 'Excel2007'.

0 votes

J'essaie de créer un PPT à l'aide de PHPPowerpoint. J'ai suivi exactement les étapes mentionnées, mais j'ai changé le nom du fichier. MIME Type à application/vnd.openxmlformats-officedocument.presentationml‌​.presentation il télécharge le fichier sur mon système mais dit que File can't be opened . Le fichier fonctionnait lorsque le code l'écrivait sur le serveur.

0 votes

Le type de contenu pour xlsx devrait être le suivant : "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet". Voir filext.com/faq/office_mime_types.php

5voto

JoshStrange Points 642

Utilisez cet appel

$objWriter->save('php://output');

Pour sortir la feuille XLS sur la page où vous vous trouvez, assurez-vous que la page où vous vous trouvez n'a pas d'autre écho, impression ou sortie.

0 votes

Lorsque je travaille dans un hébergement partagé, j'obtiens une erreur (peut-être liée aux permissions des fichiers et des dossiers) lorsque j'utilise $objWriter->save('php://output') ; exception non attrapée 'PHPExcel_Writer_Exception' avec le message 'Could not open php://output for writing.' in third_party/PHPExcel/Writer/Excel2007.php:241 Stack trace : #0

0 votes

J'essaie de créer un PPT à l'aide de PHPPowerpoint. J'ai suivi exactement les étapes mentionnées, mais j'ai changé le nom du fichier. MIME Type à application/vnd.openxmlformats-officedocument.presentationml‌​.presentation il télécharge le fichier sur mon système mais dit que File can't be opened . Le fichier fonctionnait lorsque le code l'écrivait sur le serveur.

3voto

Il est possible que vous ayez déjà résolu votre problème, en tout cas j'espère que cela vous aidera.

tous les fichiers téléchargés commencent par une ligne vide, dans mon cas il y a quatre lignes vides lignes vides, et cela pose un problème. Peu importe si vous travaillez avec readfile(); o save('php://output'); Cela peut être corrigé en ajoutant ob_start(); au début du script et ob_end_clean(); juste avant le readfile() ; ou save('php://output'); .

0 votes

Le problème que vous rencontrez est lié à la consignation et au signalement des erreurs : vous ne voyez pas les avertissements qui vous auraient mis sur la piste du problème : les en-têtes déjà envoyés. Ce problème est décrit dans cette question de référence : stackoverflow.com/q/8028957/367456

2 votes

ob_end_clean() pas od_end_clean()

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X