UTL_FILE is fine when you've got the permissions and can access the permissioned drive/directory. But often as not you need some SQL just to write some output locally.
The trick here when you're spooling is //not// to use the dbms_output.put_line routine if you need spaces, but to build up your output creatively using SELECTs, either from the db or from dual. You could build up your output line using something like
SPOOL OFF
DEFINE Temp = 'c:\temp\output.txt'
DEFINE v_padding = ' '
DEFINE v_text = 'some text here'
SET HEADING OFF FEEDBACK OFF TERMOUT OFF ECHO OFF
SET VERIFY OFF FLUSH OFF LINESIZE 1000
spool &Temp
SELECT '&v_padding'||'&v_text' FROM dual;
SELECT '&v_padding'||my_text_field FROM my_table where rownum < 2;
spool off;
etcetera...