2012-05-29 12 views
18

Estoy tratando de descargar archivos de Excel (xlsx) usando PHPExcel de la siguiente manera.Advertencia de "contenido encontrado ilegible para Excel" al abrir archivos Excel creados con PHPExcel

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 intento abrir el archivo de Excel, se solicita una confirmación en un diálogo de conformar.

Excel encontró contenido ilegible en 'test.xlsx'. ¿Desea recuperar el contenido de este libro de trabajo? Si confía en el origen de este libro de trabajo , haga clic en Sí.

También probé a cambiar la cabecera 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 confirmación de la misma. ¿Qué estoy haciendo mal aquí, por favor?

+3

Abra el archivo en un editor de texto, y mire para ver si hay algún espacio en blanco al principio o al final del archivo, o cualquier mensaje de error obvio visible. –

+0

En el editor de texto (Bloc de notas), se muestra algo como esto 'PK ¾ @ G'D²X ð [Tipos_del_contenido] .xml" MNÃ0 ... ÷ œ "ò% nY" švAa \t • (0ö¤ ± êØ-gúw {& i ‰ @ ÕnbEö {ßøyìÑdÛ¸l \t mð ¥ '× ÁX¿ (ÅÛü) ¿' òF¹à¡; @ 1_æ »~ ± Øc) j ¢ x /% ê ... Eày| © QÄ¿i! £ ÒKμ y3ÜJ <§œZ1½0? YÙL% zV cäÖIb7Ø ‡ û ìa/lÙ ¥ P1: "qáríÍjªÊj0A¯-Íuë" "íàÙ (Œ \t" Á € WìMä) Tjå' y mucho más contenido – Tiny

+1

Sus encabezados de tipo de contenido simplemente se sobrescriben en la última llamada , ¿puedes probar "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", también puedo sugerir agregar un "Content-length" (encabezado con el conteo de bytes del documento) [http://stackoverflow.com/a/ 10630871/61795] usando strlen, puede haber problemas de descarga. – Scuzzy

Respuesta

34

Como se dijo al cuestionar usuario minúscula en su comentario:

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

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

  • Un buen consejo es que se puede omitir la etiqueta de cierre ?> en todos los archivos de script PHP, de esa manera usted sabe que usted' no enviará ningún espacio en blanco invisible adicional al final de este.
  • También encontrar archivos de script PHP en UTF-8 en un servidor web configurado incorrectamente puede enviar un par de bytes indeseables 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 las header llamadas, se puede comprobar si los encabezados ha sido enviado por error con:

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

  • Si no se puede evitar que algunos llaman la función envía secuencias indeseables al navegador, puede "borrar" todos de la misma utilizando desde el principio de su script:

    ob_start();

    y luego, justo antes de la primera.210 llamada, utilice:

    ob_clean();

    tener cuidado de que con ello le impedirá para recibir retroalimentación de error.

  • Y, por último, como ya se ha dicho, si no hay que ejecutar nada después algún punto del script, llame al exit o die.

+0

Gracias por más explicaciones. – Tiny

+0

Tengo un problema similar. Estoy usando php pear spreadsheet writter. Resolví tu solución, pero aún así está dando el mismo mensaje de error. ¿Alguna sugerencia/consejo más? –

+0

No lo he probado con Pear Spreadsheet, lo siento Manish. – vicenteherrera

2

Dar la hoja activa un título:

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

Bueno, yo tenía este problema, mi solución estaba cambiando la cabecera Content-type a:

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

que tenía antes :

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

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

Probé todas las soluciones de esta página y todas las demás con la misma pregunta pero sin suerte. Así que, básicamente, acabo de cambiar el formato de salida de mis sobresalientes y eso resolvió el problema.

Cuestiones relacionadas