Вот несколько вариантов решения:
1. 
    ExcelApp.Visible := False; //до вывода
    ExcelApp.Visible := True; //после вывода
 Проверено, работатет, никакие процессы запущенные пользователем не мешают.
2. 
   //до вывода
    WorkBook.WorkSheets[1].EnableSelection := $FFFFEFD2;
    WorkBook.WorkSheets[1].Protect('123', False, True, True, True); 
   //после вывода
   WorkBook.WorkSheets[1].EnableSelection := 0;
   WorkBook.WorkSheets[1].UnProtect('123');
3. 
  //до вывода
   WorkBook.WorkSheets[1].Visible := $00000002;
   //после вывода
   WorkBook.WorkSheets[1].Visible := $FFFFFFFF;
4. Вывод делать в вариантный массив, а затем загружать массив целиком, загрузка почти мгновенная:
  ArrayData := VarArrayCreate([1, RowCount, 1, ColCount], varVariant);
  // Заполняем массив
  for I := 1 to RowCount do
  for J := 1 to ColCount do
  ArrayData[I, J] := J * 10 + I;
  // Левая верхняя ячейка области, в которую будем выводить данные
  Cell1 := WorkBook.WorkSheets[1].Cells[BeginRow, BeginCol];
  // Правая нижняя ячейка области, в которую будем выводить данные
  Cell2 := WorkBook.WorkSheets[1].Cells[BeginRow  + RowCount - 1, BeginCol +
  ColCount - 1];
  // Область, в которую будем выводить данные
  Range := WorkBook.WorkSheets[1].Range[Cell1, Cell2];
  //Вывод
  Range.Value := ArrayData;