[cgiapp] Output an excel file

Rhesa Rozendaal perl at rhesa.com
Fri Aug 28 17:42:19 EDT 2009


First, have you tried CAP::Output::XSV yet? It's nice and simple if you don't 
need any of the fancy Spreadsheet::WriteExcel features.


fREW Schmidt wrote:
> This is my (coworkers) problem:
> 
> My web app runs on Apache mod_perl using CGI::Application. I want to provide
> a download of a generated file. In the past (before we were using
> mod_perland CGI::App) I just spooled out a csv file to
> STDOUT as it was generated. Now I'm shooting for a little more refinement -
> creating an Excel spreadsheet using Spreadsheet::WriteExcel - and I can't
> seem it to get to print it out from the file handle.
> 
> sub export_list {
>   my $self = shift;
> 
>   binmode(STDOUT);
> 
>   my $str;
>   open my $fh, '>', \$str;
>   my $workbook = Spreadsheet::WriteExcel->new($fh);
>   my $worksheet = $workbook->add_worksheet();
>   $worksheet->write_col(0,0, ['some','data','here']);
> 
>   warn $str;
>   return $str;
> }
> 
> 
> The output is just a blank response, and the warn is blank as well.


I'm missing the call to $worksheet->close in that code. I bet that'll fix your 
problem.


> The method I'm using to write the spreadsheet to a filehandle is pretty much
> straight out of the
> documentation<http://search.cpan.org/dist/Spreadsheet-WriteExcel/lib/Spreadsheet/WriteExcel.pm#new%28%29>,
> so I assume the problem is due to some CGI::App noobery on my part. The
> documentation's suggested methods for filehandles and mod_perl proved pretty
> fruitless as well.
> 
> I guess I should mention I'm running on Windows, and that my current
> workaround is to create a file and provide the user with a link to it. That
> poses more problems, however, in regards to clearing out the directory and
> when to do so, and also authentication for access to the generated files.


You could always use IO::File->new_tmpfile to pass into new(), and afterwards 
seek + print.

There are more complex suggestions I could give, but let's see where this gets 
you first :-)

Rhesa


More information about the cgiapp mailing list