releasing/cbrtools/perl/TableFormatter/Excel.pm
changeset 607 378360dbbdba
parent 602 3145852acc89
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/TableFormatter/Excel.pm	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,157 @@
+# Copyright (c) 2002-2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of the License "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+# 
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+# 
+# Description:
+# 
+#
+# Description:
+# TableFormatter/Excel.pm
+#
+
+package TableFormatter::Excel;
+
+use Utils;
+use TableFormatter;
+use vars qw/@ISA/;
+@ISA = qw(TableFormatter);
+
+use strict;
+use Win32::OLE;
+use Cwd;
+
+sub New {
+  my $class = shift;
+  my $iniData = shift;
+
+  if ($iniData->Win32ExtensionsDisabled()) {
+    print "Cannot use Excel table format with win32 extensions disabled. It relies on Win32::OLE module to communicate with Excel. If anybody really cares about this, please rewrite the module to use Spreadsheet::WriteExcel... but you'll have to write your own auto-fit engine. Meanwhile, using Text formatting instead.";
+    require TableFormatter::Text;
+    return TableFormatter::Text->New($iniData);
+  }
+
+  return bless {}, (ref $class || $class);
+}
+
+sub PrintTable {
+  my $self = shift;
+  my $data = shift;
+  my $doHeading = shift;
+
+  my $excel = new ExcelConnection;
+
+  my $filename = Utils::PrependEpocRoot("\\epoc32\\relinfo\\temp-table.xls");
+  my $cwd = cwd;
+  $cwd =~ m/^(\w\:)/;
+  my $driveletter = $1 || "";
+  $filename = "$driveletter$filename";
+  unlink ($filename);
+
+  my $wb = $excel->Workbooks->Add;
+
+  my $ws = $wb->Worksheets(1);
+
+  if ($doHeading) {
+    my $style = $wb->Styles->Add("Headings");
+    $style->{Font}->{Bold} = 1;
+    $ws->Rows(1)->{Style} = "Headings";
+  }
+
+  for (my $row=0; $row<@$data; $row++) {
+    my $rowdata = $data->[$row];
+    for (my $col=0; $col<@$rowdata; $col++) {
+      my $cell = $ws->Cells($row+1, $col+1);
+      my $value = $rowdata->[$col];
+      next if ($value eq ""); # otherwise Excel seems to think it's 0
+      $cell->{Value} = "'$value";
+    }
+  }
+
+  $self->DoFinalFormatting($ws);
+  # We want to save, because otherwise Excel will prompt whether you
+  # want to save when you close the workbook. But on the other hand
+  # it prints horrible error messages if there is already a workbook
+  # open with the same name.
+  # So we need to implement a scheme to give each output workbook
+  # a unique name, which means some sort of cleanup mechanism. TODO!
+  #eval {
+    #$wb->SaveAs($filename);
+  #}; # ignore errors, we don't really care.
+  $excel->{Visible} = (1);
+}
+
+### Private
+
+sub FormatHeadingCell {
+  my $self = shift;
+  my $cell = shift;
+  $cell->{Style}->{Font}->{Bold} = 1;
+}
+
+sub DoFinalFormatting {
+  my $self = shift;
+  my $ws = shift;
+  $ws->Columns("A:J")->AutoFit();
+}
+
+package ExcelConnection;
+
+sub new {
+  my $excel;
+  eval {$excel = Win32::OLE->GetActiveObject('Excel.Application')};
+  die "Excel not installed" if $@;
+  unless (defined $excel) {
+      $excel = Win32::OLE->new('Excel.Application', sub {}) or die "Oops, cannot start Excel";
+  }
+  return $excel;
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+TableFormatter/Excel.pm - Formats tables in Excel
+
+=head1 INTERFACE
+
+=head2 New
+
+Creates a formatter.
+
+=head2 PrintTable 
+
+Prints the table. Two arguments: firstly, a 2D array of the data. Secondly, a Boolean specifying whether the first row is a header row.
+
+=head1 KNOWN BUGS
+
+None.
+
+=head1 COPYRIGHT
+
+ Copyright (c) 2002-2009 Nokia Corporation and/or its subsidiary(-ies).
+ All rights reserved.
+ This component and the accompanying materials are made available
+ under the terms of the License "Eclipse Public License v1.0"
+ which accompanies this distribution, and is available
+ at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ 
+ Initial Contributors:
+ Nokia Corporation - initial contribution.
+ 
+ Contributors:
+ 
+ Description:
+ 
+
+=cut
+