Beefy Boxes and Bandwidth Generously Provided by pair Networks
Welcome to the Monastery

Re: Spreadsheet::WriteExcel with CGI

by ChemBoy (Priest)
on Dec 08, 2005 at 21:47 UTC ( [id://515396] : note . print w/replies, xml ) Need Help??

in reply to Spreadsheet::WriteExcel with CGI

It may not be the cleanest of solutions, but at the moment we do what you're doing with a temp file: create the .XLS file in some random location, then read it back into memory (in the same script) and print it to the client (then, presumably, delete the temp file). This keeps everything in one process, so you can report errors directly to the client (and not bother forking), and also lets you defer printing the headers until you know more about your output (the size, of course, but also if there were any errors as you fetched the data).

That is:

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 migh +t help print header( -type=>"application/", -content_length=>$size, -attachment=>$file, # assuming you set that elsewhere ), $data;

If God had meant us to fly, he would *never* have given us the railroads.
    --Michael Flanders

Replies are listed 'Best First'.
Re^2: Spreadsheet::WriteExcel with CGI
by amt (Monk) on Dec 09, 2005 at 15:56 UTC
    i'm getting an error for $! as "Resource temporarily Unavailable". I'm trying to write to a file using Spreadsheet::WriteExcel's write(). The $worksheet object is defined at the top of the file, but when I hit the below while loop, it won't write() and puts RTU in the $! variable.

    I don't think it's a scoping issue because the $worksheet object is defined well before the while loop. My query for the information that needs to go into the doesn't choke, so I'm not writing with uninitialized variables. Would appreciate your opinion.
    # At top of file my $workbook = Spreadsheet::WriteExcel->new($target); my $worksheet = $workbook->add_worksheet("Ventus_Networks_Invoice"); my $row = 0; ... # This is the header row, that prints if( $qrv > 0 ) { my $mid_header = $workbook->add_format(%oUpper,%iLeft,%iRight,%greybg,%fBold,%iLower); my $mid_theader= $workbook->add_format(%oUpper,%iLeft,%iRight,%greybg,%fBold,%iLower,%f +Twrap); $worksheet->write($row,0,'Site Name',$workbook->add_format(%oUpper,%oLeft,%iLower,%iRight,%greybg,%fB +old)); ... # After headers are printed, print data while(my @i = $sth_site->fetchrow_array() ){ $worksheet->write($row,0,$i[1], $workbook->add_format(%oLeft,%iRight,%iLower)); # Location ID # This is where $! is set to "Resource Temporarily Unavailable


      I'm not all that familiar with the internal workings of S::WE, but that seems very odd. Are you sure the write() call is actually failing? I apologize if that's obvious, but I see from the documentation that it returns 0 on success, and your snippet doesn't include code that reports the error, so it seemed worth checking. Also, I haven't any other ideas at all, unless there's some bizarre issue with the filesystem your temp directory is on—I don't think I've ever seen code that produced that particular error. :-\

      If God had meant us to fly, he would *never* have given us the railroads.
          --Michael Flanders