“Excel encontró contenido ilegible” cuando se abren archivos de Excel creados con PHPExcel

Estoy intentando descargar archivos de Excel (xlsx) usando PHPExcel siguiente manera.

 require_once("../../phpExcel/Classes/PHPExcel.php"); require_once("../../phpExcel/Classes/PHPExcel/IOFactory.php"); $objPHPExcel = new PHPExcel(); $objPHPExcel->getProperties()->setCreator("Tiny") ->setLastModifiedBy("Tiny") ->setTitle("Office 2007 XLSX Test Document") ->setSubject("Office 2007 XLSX Test Document") ->setDescription("Test document for Office 2007 XLSX, generated using PHP classes."); $objPHPExcel->setActiveSheetIndex(0); $sheet=$objPHPExcel->getActiveSheet(); $sheet->setCellValue('A1', 'Hello'); $sheet->setCellValue('B2', 'world!'); $sheet->setCellValue('C1', 'Hello'); $sheet->setCellValue('D2', 'world!'); header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'); header('Content-Disposition: attachment;filename="test.xlsx"'); header('Cache-Control: max-age=0'); $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007'); $objWriter->save('php://output'); 

Funciona, pero cuando bash abrir el archivo de Excel, solicita una confirmación en un cuadro de diálogo de conformidad.

Excel encontró contenido ilegible en ‘test.xlsx’. ¿Quieres recuperar los contenidos de este libro? Si confía en la fuente de este libro, haga clic en Sí.

También intenté cambiar el encabezado de la siguiente manera

 header("Pragma: public"); header("Expires: 0"); header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); header("Content-Type: application/force-download"); header("Content-Type: application/octet-stream"); header("Content-Type: application/download");; header("Content-Disposition: attachment;filename=test.xlsx"); header("Content-Transfer-Encoding: binary"); 

Todavía pide la misma confirmación. ¿Qué estoy haciendo mal aquí, por favor?

Según lo dicho por el usuario Tiny en su propio comentario:

Finalmente, funcionó. Acabo de agregar exit al final de mi script PHP (al final del primer fragmento de código en la pregunta). Muchas gracias a todos por darme consejos útiles.

Para dar algunos consejos adicionales constructivos sobre este tipo de problemas:

  • Un buen consejo es que puede omitir la etiqueta de cierre ?> En todos los archivos de script de PHP, de esa forma sabrá que no está enviando ningún espacio en blanco invisible adicional al final.
  • Además, los archivos de script PHP adjuntos en UTF-8 en un servidor web configurado incorrectamente pueden enviar un par de bytes no deseados al comienzo del script. Abra el archivo PHP en Notepad ++, verifique si es UTF-8 y, en ese caso, conviértalo a ANSI. Si eso lo hace funcionar, verifique la configuración de su servidor web / php.
  • Justo antes de que el header llame, puede verificar si los encabezados se enviaron incorrectamente con:

    if ( headers_sent() ) die("**Error: headers sent");

  • Si no puede evitar que alguna llamada de función envíe cadenas no deseadas al navegador, puede “borrar” todo eso al principio de su script:

    ob_start();

    y luego, justo antes de que llamen los primeros headers , use:

    ob_clean();

    Tenga cuidado de que al hacerlo evitará que reciba comentarios de error.

  • Y, por último, como ya se dijo, si no hay que ejecutar nada después de algún punto en el script, llame a exit o die .

Este error también se puede desencadenar sirviendo el archivo sin los encabezados Content-Length.

Mira el ejemplo dado aquí en php.net

Bueno, tuve este problema, mi solución fue cambiar el tipo de contenido del encabezado a:

 header('Content-Type: application/openxmlformats-officedocument.spreadsheetml.sheet'); 

Yo lo tuve antes:

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

y cambié el formato a Excel2007, estaba usando Excel5 para el formato Excel 2003 xls.

Probé todas las soluciones de esta página y todas las otras páginas con la misma pregunta pero no con suerte. Básicamente, acabo de cambiar el formato de salida de mis sobresalientes y eso resolvió el problema.

Dale a la hoja activa un título:

 $sheet->setTitle('Some title string here'); 

Pongo solo la salida; Después

PHPExcel_IOFactory :: createWriter ($ phpExcelObject, ‘Excel2007’) -> save (“php: // output”);

Y funciona para mi 🙂

  $file_name .= "_".\Carbon\Carbon::now()->format('d_m_Y_H_i').'.xlsx'; // Prepare To Download header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'); header('Content-Disposition: attachment;filename='.$file_name); header('Cache-Control: max-age=0'); header('Pragma: public'); PHPExcel_IOFactory::createWriter($phpExcelObject, 'Excel2007')->save("php://output"); exit;