queste istruzioni
non fanno altro se non dire al programma di generare un output verso un browser informandolo che il contenuto sarà un file di tipo ExcelCodice PHP:
header ("Content-Type: application/vnd.ms-excel");
header ("Content-Disposition: inline; filename=$filename");
il codice che segue queste istruzioni, che tu ometti, dovrebbe essere quello che genera lo stream verso il browser: nel secondo codice che hai postato e che dici che funziona correttamente, puoi notare che $file_data è la concatenazione del risultato di vari passaggi e che l'output è la scrittura del file sul server
Codice PHP:
$handle = fopen($filename,"a");
fwrite($handle, $
fclose($handle);
in definitiva: fai in modo che il tuo codice che inizia con la dichiarazione degli header generi un output che possa essere "conservato" in una variabile e a fine elaborazione scrivi questa variabile in un file. Se non serve restituire il file al browser, elimina del tutto la parte relativa agli header