queste istruzioni
Codice PHP:
header ("Content-Type: application/vnd.ms-excel");
header ("Content-Disposition: inline; filename=$filename"); 
non fanno altro se non dire al programma di generare un output verso un browser informandolo che il contenuto sarà un file di tipo Excel

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