Freebird: pierwszy efekt, który chciałeś osiągnąć najprościej otrzymać poprzez headery w stylu:
"Content-type: application/unknown; plik.xls" - tutaj możesz wstawić typ MIME, jeśli pamiętasz, jaki ma typ plik Excela albo sobie gdzieś to sprawdzisz oraz nazwę pliku, pod jaką domyślnie będzie chciała zapisać plik przeglądarka,
"Pragma: no-cache" - za każdym razem przy ściąganiu ściąga się od nowa, więc nie próbuje wyciągnąć z cache starego pliku, tylko zawsze wykonuje skrypt i ściąga aktualną wersję, co pozwala na uzyskanie zawsze najnowszej wersji,
"Content-Disposition: attachment; filename="plik.xls"" - tutaj raz jeszcze nazwa tego pliku,
"Content-Length: 1234" - rozmiar pliku w bajtach,
a następnie albo readfile();, jeśli masz plik zapisany na serwerze, albo echo, jeśli masz wynik w jakimś stringu.