show footers in XLS and CSV reports, #18823
authorMark Wells <mark@freeside.biz>
Wed, 29 Aug 2012 01:44:42 +0000 (18:44 -0700)
committerMark Wells <mark@freeside.biz>
Wed, 29 Aug 2012 01:44:42 +0000 (18:44 -0700)
httemplate/search/elements/search-csv.html
httemplate/search/elements/search-xls.html

index 9eb1b66..90230e6 100644 (file)
 %     $csv->combine(@$row); #or die $csv->status;
 %   }
 %
-%      
 <% $csv->string %>\
 %
 % }
+% 
+% if ( $opt{'footer'} and !$opt{'no_csv_header'} ) {
+%   my @footer;
+%   foreach my $item (@{ $opt{'footer'} }) {
+%     if ( ref($item) eq 'CODE' ) {
+%       $item = &{$item}();
+%     }
+%     push @footer, $item;
+%   }
+%   $csv->combine(@footer);
+<% $csv->string %>\
+% }
 <%init>
 
 my %args = @_;
index 09dbe46..94d88b0 100644 (file)
@@ -55,6 +55,10 @@ my $writer = sub {
   # Wrapper for $worksheet->write.
   # Do any massaging of the value/format here.
   my ($r, $c, $value, $format) = @_;
+  # convert HTML entities
+  # both Spreadsheet::WriteExcel and Excel::Writer::XLSX accept UTF-8 strings
+  $value = decode_entities($value);
+
   if ( $value =~ /^\Q$money_char\E(-?\d+\.?\d*)$/ ) {
     # Currency: strip the symbol, clone the requested format,
     # and format it for currency
@@ -130,6 +134,17 @@ foreach my $row ( @$rows ) {
 
 }
 
+if ( $opt{'footer'} ) {
+  $r++;
+  $c = 0;
+  foreach my $item (@{ $opt{'footer'} }) {
+    if ( ref($item) eq 'CODE' ) {
+      $item = &{$item}();
+    }
+    $writer->( $r, $c++, $item, $header_format );
+  }
+}
+
 $workbook->close();# or die "Error creating .xls file: $!";
 
 http_header('Content-Length' => length($data) );