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

Dvir Levy
fuente

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 .

hakre
fuente
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');
matino
fuente
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');
Rogerio de Moraes
fuente
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.

Josh Extraño
fuente
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');
harsimer
fuente
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');.

Efren Gutiérrez Sosa
fuente
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