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 )