From 94d8780ba4592d498b105dac663a6120ff0db0c9 Mon Sep 17 00:00:00 2001 From: Fridolin Somers Date: Fri, 7 Dec 2018 10:30:30 +0100 Subject: [PATCH] Bug 21560: Optimize ODS export of gather_print_notices.pl Like previous patch, the call on OpenOffice-OODoc lib can be optimized. Based on https://grep.metacpan.org/search?qci=&q=expandTable&qft=&qd=OpenOffice-OODoc&f=examples%2Ftext2table Test plan inspired from Bug 11679. Test plan: - define your ODUE notice for the print template as: cardnumber:patron:email:item <>:<> <>:<>:<> - define overdues rules for a patron category - check-out 2 items using a due date in order to generate the overdue notices - check-in these 2 items - launch the script /misc/cronjobs/overdue_notices.pl - the 'message_queue' table should now contain 2 new entries - launch the gather_print_notices cronjob : perl misc/cronjobs/gather_print_notices.pl /tmp/test --ods --letter_code=OVERDUE -d=: - A ods file should be generated in your /tmp/test directory - Compare times with and without patch Signed-off-by: David Nind --- misc/cronjobs/gather_print_notices.pl | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/misc/cronjobs/gather_print_notices.pl b/misc/cronjobs/gather_print_notices.pl index cb1aecf94d..ebd3dd86f5 100755 --- a/misc/cronjobs/gather_print_notices.pl +++ b/misc/cronjobs/gather_print_notices.pl @@ -254,18 +254,16 @@ sub generate_ods { my $messages = $params->{messages}; my $filepath = $params->{filepath}; + # Create document use OpenOffice::OODoc; my $tmpdir = dirname $filepath; odfWorkingDirectory( $tmpdir ); - my $container = odfContainer( $filepath, create => 'spreadsheet' ); - my $doc = odfDocument ( - container => $container, - part => 'content' - ); - my $table = $doc->getTable(0); + my $doc = odfDocument( file => $filepath, create => 'spreadsheet' ); + # Prepare sheet my @headers; - my ( $nb_rows, $nb_cols, $i ) = ( scalar(@$messages), 0, 0 ); + my @rows; + my $i = 0; foreach my $message ( @$messages ) { my @lines = split /\n/, $message->{content}; chomp for @lines; @@ -273,10 +271,13 @@ sub generate_ods { # We don't have headers, get them unless ( @headers ) { @headers = split $delimiter, $lines[0]; + my $nb_cols = scalar @headers; + my $nb_rows = scalar @$messages; + my $sheet = $doc->expandTable( 0, $nb_rows + 1, $nb_cols ); + @rows = $doc->getTableRows($sheet); - $nb_cols = @headers; - $doc->expandTable( $table, $nb_rows + 1, $nb_cols ); - my $row = $doc->getRow( $table, 0 ); + # Write headers row + my $row = $rows[0]; my $j = 0; for my $header ( @headers ) { $doc->cellValue( $row, $j, Encode::encode( 'UTF8', $header ) ); @@ -285,10 +286,11 @@ sub generate_ods { $i = 1; } + # Write all rows shift @lines; # remove headers for my $line ( @lines ) { my @row_data = split $delimiter, $line; - my $row = $doc->getRow( $table, $i ); + my $row = $rows[$i]; # Note scalar(@$row_data) should be equal to $nb_cols for ( my $j = 0 ; $j < scalar(@row_data) ; $j++ ) { my $value = Encode::encode( 'UTF8', $row_data[$j] ); -- 2.11.0