phpexcel para descargar


79

hola, soy nuevo en phpexcel, y me preguntaba si hay alguna forma de enviar el Excel que he creado a los clientes para descargarlo sin guardarlo en mi servidor o eliminarlo justo después de que lo descargue

Estoy tratando de crear un "botón de exportación" en una página que le dará al usuario una "ventana emergente" con el Excel que él quiere que acabo de crear.

ahora, después de crear la tabla, hago:

$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");

pero eso lo guarda en mi servidor

gracias

Respuestas:


169

En lugar de guardarlo en un archivo, guárdelo en php://outputDocs :

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

Esto lo enviará TAL CUAL al navegador.

Si desea añadir algunas cabeceras de Docs en primer lugar, como es común con las descargas de archivos, por lo que el navegador sabe qué tipo de archivos que es y cómo debe ser nombrado (el nombre del archivo):

// 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');

Primero haga los encabezados, luego guarde. Para los encabezados de Excel, consulte también la siguiente pregunta: Configuración del tipo de mime para el documento de Excel .


1
Estoy obteniendo un archivo para descargar pero no es lo que he creado y cuando lo hago $ objWriter-> save ('php: // output') arruina mi página de agujero = \
Dvir Levy

1
Tenga cuidado de que lo único que genere en esa página sea el resultado de las dos headerlíneas y la ->save()acción. Es necesario decidir entre: a) mostrar una página o b) ofrecen una descarga. Ambos no funcionan fácilmente con un solo script. Sin embargo, puede crear una secuencia de comandos para la descarga y otra para la página, y cuando la secuencia de comandos de la página se haya ejecutado, redirigir a la secuencia de comandos de descarga que hará que el navegador ofrezca el cuadro de diálogo Guardar como.
Hakre

mi problema es que estoy usando joomla y no puedo encontrar la manera de cargarlo desde una página vacía. cada vez que lo intento, obtengo la página completa de joomla con menús y todo. ¿Sabes dónde puedo encontrar una respuesta a este problema? No quiero desbordar la pila de spam ...
Dvir Levy

Dvir: use & format = raw en su url. En su mvc, cree un archivo view.raw.php.
MSD

1
¿Cómo se puede configurar el Content-Lengthencabezado cuando se usa php://output?
tonix

22
$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');

hola y gracias por la respuesta. puse la línea $ escritor-> guardar ('php: // salida'); y no descarga el archivo, imprime basura en la página. ¿Sabes por que pasa esto?
Dvir Levy

¿Ha configurado los encabezados también?
matino

Estoy tratando de construir un PPT usando PHPPowerpoint, exactamente hice los pasos mencionados, pero cambiando el MIMETipo a application/vnd.openxmlformats-officedocument.presentationml.presentation, está descargando el archivo en mi sistema pero diciendo eso File can't be opened. El archivo estaba funcionando cuando el código lo estaba escribiendo en el servidor.
anulado el

Funcionó perfecto para mí. ¡Gracias¡
Jam

6

PARA USO XLSX

SET IN $ xlsName nombre de XLSX con extensión. Ejemplo: $ 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');

PARA USO XLS

SET IN $ xlsName nombre de XLS con extensión. Ejemplo: $ 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
PSI: el formato XLS es la definición predeterminada de 'Excel5' y XLSX es 'Excel2007'.
Rogerio de Moraes

Estoy tratando de construir un PPT usando PHPPowerpoint, exactamente hice los pasos mencionados, pero cambiando el MIMETipo a application/vnd.openxmlformats-officedocument.presentationml.presentation, está descargando el archivo en mi sistema pero diciendo eso File can't be opened. El archivo estaba funcionando cuando el código lo estaba escribiendo en el servidor.
anulado el

El tipo de contenido para xlsx debe leer: "application / vnd.openxmlformats-officedocument.spreadsheetml.sheet". Ver filext.com/faq/office_mime_types.php
kojow7

5

Usa esta llamada

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

Para enviar la hoja XLS a la página en la que se encuentra, solo asegúrese de que la página en la que se encuentra no tenga otras salidas de eco, impresión.


Cuando trabajo en alojamiento compartido, obtengo un error (tal vez relacionado con los permisos de archivos y carpetas) al usar $ objWriter-> save ('php: // output'); Excepción no detectada 'PHPExcel_Writer_Exception' con el mensaje 'No se pudo abrir la salida php: // para escritura'. en third_party / PHPExcel / Writer / Excel2007.php: 241 Seguimiento de pila: # 0
Enrique

Estoy tratando de construir un PPT usando PHPPowerpoint, exactamente hice los pasos mencionados, pero cambiando el MIMETipo a application/vnd.openxmlformats-officedocument.presentationml.presentation, está descargando el archivo en mi sistema pero diciendo eso File can't be opened. El archivo estaba funcionando cuando el código lo estaba escribiendo en el servidor.
anulado el

3
 header('Content-type: application/vnd.ms-excel');

 header('Content-Disposition: attachment; filename="file.xlsx"');

 header('Cache-Control: max-age=0');

 header ('Expires: Mon, 26 Jul 1997 05:00:00 GMT');

 header ('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT');

 header ('Cache-Control: cache, must-revalidate');

 header ('Pragma: public');

 $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');

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

Estoy tratando de construir un PPT usando PHPPowerpoint, exactamente hice los pasos mencionados, pero cambiando el MIMETipo a application/vnd.openxmlformats-officedocument.presentationml.presentation, está descargando el archivo en mi sistema pero diciendo eso File can't be opened. El archivo estaba funcionando cuando el código lo estaba escribiendo en el servidor.
anulado el

3

Es posible que ya hayas resuelto tu problema, de todos modos espero que esto te ayude.

todos los archivos descargados comienzan con una línea vacía, en mi caso con cuatro líneas vacías, y eso crea un problema. No importa si trabaja con readfile();o save('php://output');, esto se puede solucionar agregando ob_start();al principio del script y ob_end_clean();justo antes de readfile(); o save('php://output');.


El problema que tiene es con su registro e informe de errores: no ve las advertencias que le habrían apuntado al problema: los encabezados ya se enviaron. Esto se describe en esta pregunta de referencia: stackoverflow.com/q/8028957/367456
hakre

2
ob_end_clean()nood_end_clean()
Turson
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.