RT-Extension-SearchResults-ODS
view release on metacpan or search on metacpan
html/Search/Results.ods view on Meta::CPAN
my $should_loc = { map { $_ => 1 } qw(Status) };
my $col_entry = sub {
my $col = shift;
# in tsv output, "#" is often a comment character but we use it for "id"
delete $col->{title}
if $col->{title} and $col->{title} =~ /^\s*#\s*$/;
return {
header => Encode::encode_utf8(loc($col->{title} || $col->{attribute})),
map => $m->comp(
"/Elements/ColumnMap",
Name => $col->{attribute},
Attr => 'value'
),
should_loc => $should_loc->{$col->{attribute}},
}
};
if ($PreserveNewLines) {
my $col = [];
push @columns, $col;
for (@Format) {
if ($_->{title} eq 'NEWLINE') {
$col = [];
push @columns, $col;
}
else {
push @$col, $col_entry->($_);
}
}
}
else {
push @columns, [map { $_->{attribute}
? $col_entry->($_)
: () } @Format];
}
my $Tickets = RT::Tickets->new( $session{'CurrentUser'} );
$Tickets->FromSQL( $Query );
if ( $OrderBy =~ /\|/ ) {
# Multiple Sorts
my @OrderBy = split /\|/, $OrderBy;
my @Order = split /\|/, $Order;
$Tickets->OrderByCols(
map { { FIELD => $OrderBy[$_], ORDER => $Order[$_] } }
( 0 .. $#OrderBy )
);
}
else {
$Tickets->OrderBy( FIELD => $OrderBy, ORDER => $Order );
}
my $rows_count = $Tickets->Count;
my $cols_count = 0;
foreach my $col (@columns) {
foreach my $sub_col (@$col) {
$cols_count++;
}
}
$workbook->expandTable(0, $rows_count, $cols_count );
sub int_to_alpha {
my $int = shift;
$int++;
my $dividend = $int;
my $alpha = '';
my $modulo;
while ($dividend > 0 ) {
$modulo = ($dividend - 1) % 26;
$alpha = chr(65 + $modulo).$alpha;
$dividend = int(($dividend - $modulo) / 26);
}
return $alpha;
}
my $xml = '<table:database-ranges><table:database-range table:name="AllRTTickets" table:target-range-address="Sheet1.A1:Sheet1.'.int_to_alpha($cols_count - 1).$rows_count.'"/></table:database-ranges>';
my $xmlpos = $workbook->getElement('//table:table', 0);
$workbook->insertElement ( $xmlpos, $xml, position => 'after');
my $ws_col = 0;
foreach my $col (@columns) {
foreach my $sub_col ( @$col ) {
my $label = $sub_col->{header};
Encode::_utf8_off($label);
$workbook->updateCell(0, 0, $ws_col, $label);
$ws_col++;
}
}
my $ws_row = 1;
my $ii = 0;
while (my $row = $Tickets->Next) {
$ws_col = 0;
for my $col (@columns) {
for (@$col) {
my $val = ProcessColumnMapValue($_->{map}, Arguments => [$row, $ii++], Escape => 0);
$val = loc($val) if $_->{should_loc};
# remove tabs from all field values, they screw up the tsv
$val = '' unless defined $val;
$val =~ s/(?:\n|\r)//g; $val =~ s{\t}{ }g;
$val = $no_html->scrub($val);
$val = HTML::Entities::decode_entities($val);
Encode::_utf8_off($val);
$workbook->updateCell(0, $ws_row, $ws_col, $val);
$ws_col++;
}
}
$ws_row++;
}
$workbook->save();
open (ODT, $tmpfile);
while (<ODT>) {
$m->print($_);
}
close (ODT);
unlink ($tmpfile);
( run in 1.577 second using v1.01-cache-2.11-cpan-99c4e6809bf )