Если уж мы говорим про Битрикс24, то для начала было бы не плохо не выводить содержимое буфера до вызова вашего кода.
Это можно сделать при помощи кода:
global $APPLICATION;
$APPLICATION->RestartBuffer();
Затем чтобы это все корректно прочиталось, необходимо еще и предотвратить вывод после этого кода.
Упрощенный вариант как можно это сделать:
\CMain::FinalActions();
Таким образом ваш код можно дополнить до следующего результата:
global $APPLICATION;
$APPLICATION->RestartBuffer();
$file="demo.xls";
$test="<table ><tr><td>Cell 1</td><td>Cell 2</td></tr></table>";
header("Content-type: application/vnd.ms-excel");
header("Content-Disposition: attachment; filename=$file");
echo $test;
\CMain::FinalActions();