Resulta que si desde PHP, forzamos que el navegador descargue el archivo que se genera, en vez de mostrarlo inline, Internet Explorer 6 o superiores, a veces se informa que no es posible descargar el archivo, y dan un error.

Es un error que me traía de cabeza hace algún tiempo, y que hoy he conseguido solventar gracias a la información de algunas páginas web (lo siento pero no recuerdo sus nombres).

Típicamente el código de descarga en PHP suele ser así:

<?php
session_start();
header("Content-type: application/x-msexcel");
header("Content-type: application/vnd.ms-excel");
header("Content-disposition: attachment; filename=MiExcel.xls");
echo "…Código del libreo Excel a descargar…";
?>

Con otros navegadores, el archivo suele descargarse sin problemas.

En este caso, el problema viene provocado por el inicio de sesión con session_start, que manda al cliente una cabecera HTTP con la cookie,y hace que Internet Explorer interprete de forma demasiado estricta el resto del contenido HTTP. En nuestro caso las otras cabeceras HTTP, y el contenido del Excel mismo.

Como vemos, el problema únicamente ocurre si se abre una sesión antes de proceder con la descarga. Corregirlo es tan sencillo como eliminar la sesión en el caso que no nos haga falta, o indicar a PHP que no mande cabecera alguna para el manejo de la sesión, usando la función session_cache_limiter.

El código actualizado, iría así:

<?php
session_cache_limiter("none");
session_start();
header("Content-type: application/x-msexcel");
header("Content-type: application/vnd.ms-excel");
header("Content-disposition: attachment; filename=SBS.xls");
?>