use File::Temp 'tempfile'; use CGI 'header'; my ($fh,$filename) = tempfile(); my $workbook = Spreadsheet::WriteExcel->new($filename); do_stuff($workbook); $fh->seek(0,0); my $data; my $size = -z $filename; $size== $fh->read($data,$size) or bail_the_heck_out(); #CGI::Carp might help print header( -type=>"application/vnd.ms-excel", -content_length=>$size, -attachment=>$file, # assuming you set that elsewhere ), $data;