%# BEGIN BPS TAGGED BLOCK {{{ %# %# COPYRIGHT: %# %# This software is Copyright (c) 1996-2009 Best Practical Solutions, LLC %# %# %# (Except where explicitly superseded by other copyright notices) %# %# %# LICENSE: %# %# This work is made available to you under the terms of Version 2 of %# the GNU General Public License. A copy of that license should have %# been provided with this software, but in any event can be snarfed %# from www.gnu.org. %# %# This work is distributed in the hope that it will be useful, but %# WITHOUT ANY WARRANTY; without even the implied warranty of %# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU %# General Public License for more details. %# %# You should have received a copy of the GNU General Public License %# along with this program; if not, write to the Free Software %# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA %# 02110-1301 or visit their web page on the internet at %# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html. %# %# %# CONTRIBUTION SUBMISSION POLICY: %# %# (The following paragraph is not intended to limit the rights granted %# to you to modify and distribute this software under the terms of %# the GNU General Public License and is only of importance to you if %# you choose to contribute your changes and enhancements to the %# community by submitting them to Best Practical Solutions, LLC.) %# %# By intentionally submitting any modifications, corrections or %# derivatives to this work, or any other work intended for use with %# Request Tracker, to Best Practical Solutions, LLC, you confirm that %# you are the copyright holder for those contributions and you grant %# Best Practical Solutions, LLC a nonexclusive, worldwide, irrevocable, %# royalty-free, perpetual, license to use, copy, create derivative %# works based on those contributions, and sublicense and distribute %# those contributions and any derivatives thereof. %# %# END BPS TAGGED BLOCK }}} <%ARGS> $Query => undef $OrderBy => 'id' $Order => 'ASC' $Format => undef <%INIT> use Spreadsheet::WriteExcel; use List::Util qw( max ); use Date::Format qw( time2str ); $r->content_type('application/vnd.ms-excel'); $r->header_out('Content-Disposition' => 'attachment;filename="Results.xls"'); my $xls; my $fh; open ($fh, ">", \$xls) or die "$!"; my $workbook = Spreadsheet::WriteExcel->new($fh) or die $!; my $worksheet = $workbook->add_worksheet(); my $default_format = $workbook->add_format( color => 'black', size => 10, ); my $date_format = $workbook->add_format( color => 'black', size => 10, num_format => 'YYYY-MM-DD', #configurable? ); my $title_format = $workbook->add_format( color => 'black', size => 10, bold => 1, bg_color=> 'silver', ); my @width; my $row = 1; my $WriteHeader = sub { my @header = @_; @width = (); for ( my $item = 0; $item < scalar @header; $item++ ) { my $title = $header[$item]; $worksheet->write(0, $item, $title, $title_format); $width[$item] = 1.1 * length($title); } }; my $WriteRow = sub { my @row = @_; my $height = 0; for ( my $item = 0; $item < scalar @row; $item++ ) { my @lines = @{ $row[$item] }; # record row/column sizes $height = max( $height, scalar(@lines) ); $width[$item] = max( $width[$item], map {length} @lines ); if ( scalar(@lines) == 1 and $lines[0] =~ /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}$/ ) { $worksheet->write_date_time($row, $item, $lines[0], $date_format); next; } $worksheet->write($row, $item, join("\n", @lines), $default_format); } $worksheet->set_row($row, $height * 14); $row++; }; my $FormatDate = sub { my $DateObj = shift; return '' if $DateObj->Unix == 0; return time2str('%Y-%m-%dT%H:%M', $DateObj->Unix); }; # Write everything to the worksheet $m->comp('Elements/ResultsStructuredView', Query => $Query, OrderBy => $OrderBy, Order => $Order, Format => $Format, WriteHeader => $WriteHeader, WriteRow => $WriteRow, FormatDate => $FormatDate, ); # Set column widths for( my $item = 0; $item < scalar @width; $item++ ) { $worksheet->set_column($item, $item, $width[$item]); } # and then write everything out. $workbook->close; close($fh); $m->print($xls); $m->abort();