package Excel::Template::Element::Range;
use strict;
use Spreadsheet::WriteExcel::Utility;
BEGIN {
use vars qw(@ISA);
@ISA = qw(Excel::Template::Element);
use Excel::Template::Element;
}
sub min { $_[0] < $_[1] ? $_[0] : $_[1] }
sub max { $_[0] > $_[1] ? $_[0] : $_[1] }
sub resolve
{
my $self = shift;
my ($context) = @_;
my $ref_name = $context->resolve($self, 'REF');
my @refs = $context->get_all_references( $ref_name );
return '' unless @refs;
return $self->_join_refs(@refs);
}
sub _join_refs {
my ($self, @refs) = @_;
my ($top, $left, $bottom, $right) =
( $refs[0][0], $refs[0][1] ) x 2;
shift @refs;
foreach my $ref ( @refs )
{
$top = min( $top, $ref->[0]);
$bottom = max( $bottom, $ref->[0]);
$left = min( $left, $ref->[1]);
$right = max( $right, $ref->[1]);
}
return join( ':',
xl_rowcol_to_cell($top, $left),
xl_rowcol_to_cell($bottom, $right)
);
}
1;
__END__
=head1 NAME
Excel::Template::Element::Range
=head1 PURPOSE
Returns a range of cell locations (i.e. B2:C2) that contains all calls using
this reference. To return the location of the last cell, use BACKREF.
=head1 NODE NAME
RANGE
=head1 INHERITANCE
Excel::Template::Element
=head1 ATTRIBUTES
=over 4
=item * REF
This is the name of the reference to look up.
=back
=head1 CHILDREN
None
=head1 EFFECTS
None
=head1 DEPENDENCIES
This will only be used within CELL tags.
=head1 USAGE
In the example...
|
| |
=SUM()
The formula in row 2 would be =SUM(B1:C1).
=head1 AUTHOR
Rob Kinyon (rkinyon@columbus.rr.com)
=head1 SEE ALSO
CELL, BACKREF
=cut