File Coverage

blib/lib/Spreadsheet/WriteExcel/FromXML/Worksheet.pm
Criterion Covered Total %
statement 12 91 13.1
branch 0 48 0.0
condition 0 8 0.0
subroutine 4 16 25.0
pod 1 11 9.0
total 17 174 9.7


line stmt bran cond sub pod time code
1             package Spreadsheet::WriteExcel::FromXML::Worksheet;
2 5     5   29 use strict;
  5         56  
  5         281  
3 5     5   28 use warnings;
  5         9  
  5         1780  
4              
5             our $VERSION = '1.1';
6              
7 5     5   32 use Carp qw(confess cluck);
  5         10  
  5         784  
8 5     5   14846 use Data::Dumper;
  5         70937  
  5         6986  
9             =head1 NAME
10              
11             Spreadsheet::WriteExcel::FromXML::Worksheet
12              
13             =head1 SYNOPSIS
14              
15             # inner class for use by FromXML
16              
17             =head1 DESCRIPTION
18              
19             Workbook object for FromXML.
20              
21             =head1 API REFERENCE
22              
23             =cut
24              
25             sub new
26             {
27 0     0 0   my $this = shift;
28 0   0       my $class = ref($this) || $this;
29 0           my $self = {};
30 0           $self->{ranges} = [];
31 0           bless $self,$class;
32 0           $self->_init( @_ );
33 0           return $self;
34             }
35              
36             sub _init
37             {
38 0     0     my($self,$excelWorksheet) = @_;
39 0 0 0       unless( $excelWorksheet && UNIVERSAL::isa($excelWorksheet,'Spreadsheet::WriteExcel::Worksheet') ) {
40 0           confess "Must pass a Spreadsheet::WriteExcel::Worksheet to constructor\n";
41             }
42 0           $self->{'_excelWorksheet'} = $excelWorksheet;
43 0           $self->cells( [[]] );
44 0           $self->dataTypeMethods( [] );
45 0           $self->formats( [] );
46             }
47              
48             =head2 addDataType
49              
50             Supported data types from Speadsheet::WriteExcel:
51              
52             write()
53             write_number()
54             write_string()
55             write_blank()
56             write_row()
57             write_col()
58             write_url()
59             write_url_range()
60             write_formula()
61              
62             =cut
63             sub addDataType
64             {
65 0     0 1   my($self,$datatype,$x,$y) = @_;
66 0 0         if( 'string' eq $datatype )
    0          
    0          
    0          
    0          
67             {
68 0           $self->dataTypeMethods->[$x][$y] = 'write_string';
69             }
70             elsif( 'number' eq $datatype )
71             {
72 0           $self->dataTypeMethods->[$x][$y] = 'write_number';
73             }
74             elsif( 'url' eq $datatype )
75             {
76 0           $self->dataTypeMethods->[$x][$y] = 'write_url';
77             }
78             elsif( 'formula' eq $datatype )
79             {
80 0           $self->dataTypeMethods->[$x][$y] = 'write_formula';
81             }
82             elsif( 'blank' eq $datatype )
83             {
84 0           $self->dataTypeMethods->[$x][$y] = 'write_blank';
85             }
86             else
87             {
88 0           cluck "unknown data type '$datatype' defaulting to write.\n";
89 0           $self->dataTypeMethods->[$x][$y] = 'write_string';
90             }
91             }
92              
93             sub addFormat
94             {
95 0     0 0   my($self,$format,$x,$y) = @_;
96 0           $self->formats->[$x][$y] = undef;
97 0 0         $self->formats->[$x][$y] = $format if ( $format );
98             }
99              
100             sub addCell
101             {
102 0     0 0   my($self,$data,$datatype,$x,$y,$format) = @_;
103             # print STDERR "Adding '",($data||''),"' to cell $$x $$y\n";
104 0   0       $self->cells->[$$x][$$y] = $data||'';
105 0           $self->addDataType( $datatype,$$x,$$y );
106 0           $self->addFormat( $format,$$x,$$y );
107             }
108              
109             sub addRange
110             {
111 0     0 0   my ($self, $first_col, $last_col, $width, $format, $hidden, $level) = @_;
112 0           my $args = {'first_col' => $first_col, 'last_col' => $last_col, 'width' => $width,
113             'format' => $format, 'hidden' => $hidden, 'level' => $level};
114 0           push(@{$self->{ranges}}, $args);
  0            
115             }
116              
117             sub setMargins
118             {
119 0     0 0   my ($self, $margin, $lr, $tb, $left, $right, $top, $bottom) = @_;
120 0 0         $self->excelWorksheet->set_margins($margin) if defined($margin);
121 0 0         $self->excelWorksheet->set_margins_LR($lr) if defined($lr);
122 0 0         $self->excelWorksheet->set_margins_TB($tb) if defined($tb);
123 0 0         $self->excelWorksheet->set_margin_left($left) if defined($left);
124 0 0         $self->excelWorksheet->set_margin_right($right) if defined($right);
125 0 0         $self->excelWorksheet->set_margin_top($top) if defined($top);
126 0 0         $self->excelWorksheet->set_margin_bottom($bottom) if defined($bottom);
127             }
128              
129              
130             sub buildWorksheet
131             {
132 0     0 0   my($self,$excelFormats) = @_;
133              
134 0           for ( my $x = 0; $x < @{$self->{ranges}}; $x++) {
  0            
135 0 0         if (${$self->{ranges}}[$x]) {
  0            
136 0           my $range = ${$self->{ranges}}[$x];
  0            
137 0           my $format = $range->{format};
138 0           my $first_col = $range->{first_col};
139 0           my $last_col = $range->{last_col};
140 0           my $width = $range->{width};
141 0           my $hidden = $range->{hidden};
142 0           my $level = $range->{level};
143 0           my $formatName = $format;
144 0 0         if( $formatName ) {
145 0 0         unless( exists $excelFormats->{ $formatName } )
146             {
147 0           cluck "format '$formatName' does not exist! Ignoring.\n";
148             } else
149             {
150 0           $format = $excelFormats->{ $formatName };
151             }
152             }
153 0           $self->excelWorksheet->set_column($first_col, $last_col, $width, $hidden, $level, $format);
154             }
155             }
156              
157 0           for( my $i = 0; $i < @{ $self->cells }; ++$i ) {
  0            
158 0 0         if( $self->cells->[$i] ) {
159 0           for( my $j = 0; $j < @{ $self->cells->[$i] }; ++$j ) {
  0            
160 0           my $formatName = $self->formats->[$i][$j];
161 0           my $format = undef;
162 0 0         if( $formatName ) {
163 0 0         unless( exists $excelFormats->{ $formatName } )
164             {
165 0           cluck "format '$formatName' does not exist! Ignoring.\n";
166             } else
167             {
168 0           $format = $excelFormats->{ $formatName };
169             }
170             }
171              
172 0           my $dataTypeMethod = $self->dataTypeMethods->[$i][$j];
173             #print "$dataTypeMethod writing $i x $j - '",$self->cells->[$i][$j],"' with format: " . Dumper($format) ."\n";
174              
175             # Hack as current write_blank code isn't working as expected.
176             # Hack disabled for external use [we use it internally] but needs to be investigated
177             #if ($dataTypeMethod eq 'write_blank') {
178             # $self->cells->[$i][$j] = undef;
179             # $dataTypeMethod = 'write_string';
180             #}
181 0           $self->excelWorksheet->$dataTypeMethod( $i, $j, $self->cells->[$i][$j], $format );
182              
183             }
184             # blank row
185             } else {
186 0           $self->excelWorksheet->write_string( $i, 0, '' );
187             }
188             }
189             }
190              
191 0 0   0 0   sub excelWorksheet { @_>1 ? $_[0]->{'_excelWorksheet'} = $_[1] : $_[0]->{'_excelWorksheet'}; }
192 0 0   0 0   sub cells { @_>1 ? $_[0]->{'_cells'} = $_[1] : $_[0]->{'_cells'}; }
193 0 0   0 0   sub dataTypeMethods { @_>1 ? $_[0]->{'_dataTypeMethods'} = $_[1] : $_[0]->{'_dataTypeMethods'}; }
194 0 0   0 0   sub formats { @_>1 ? $_[0]->{'_formats'} = $_[1] : $_[0]->{'_formats'}; }
195              
196             1;
197              
198             =head1 SEE ALSO
199              
200             SpreadSheet::WriteExcel::FromXML
201              
202             =head1 AUTHORS
203              
204             W. Justin Bedard juice@lerch.org
205              
206             Kyle R. Burton mortis@voicenet.com, krburton@cpan.org
207              
208             =cut