File: MergeRange.pm

package info (click to toggle)
libexcel-template-perl 0.34-3
  • links: PTS, VCS
  • area: main
  • in suites: bookworm, forky, sid, trixie
  • size: 608 kB
  • sloc: perl: 3,471; xml: 210; makefile: 2
file content (117 lines) | stat: -rw-r--r-- 2,191 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
package Excel::Template::Element::MergeRange;

use strict;

BEGIN {
    use vars qw(@ISA);
    @ISA = qw(Excel::Template::Element::Cell);

    use Excel::Template::Element::Cell;
    use Excel::Template::Element::Range;
}

sub render {
    my $self = shift;
    my ($context) = @_;

    my $ref_name = $context->resolve($self, 'REF');

    my @refs = $context->get_all_references( $ref_name );
    (@refs)
        || die "You must specify a ref for MERGE_RANGE";

    my $range = Excel::Template::Element::Range->_join_refs(@refs);

    # NOTE:
    # we need to copy the current format
    # because Spreadsheet::WriteExcel will 
    # mark any format used in a merged cell
    # as being specifically for a merged cell
    # and therefore not usable elsewhere.

    my $old_format = $context->active_format;

    my %values;
    while ( my ($k, $v) = each %$self ) {
        $values{$k} = $context->resolve( $self, $k );
    }

    # force is_merged on here to differentiate the formats
    $values{is_merged} = 1;

    my $format = $context->format_object->copy(
        $context, $old_format, %values,
    );
    $context->active_format($format);

    $context->active_worksheet->merge_range(
        $range,
        $self->_get_text($context),
        $format,
    );

    $context->active_format($old_format);

    return 1;
}

1;
__END__

=head1 NAME

Excel::Template::Element::MergeRange - Excel::Template::Element::MergeRange

=head1 PURPOSE

To merge a range of cells in a spreadsheet

=head1 NODE NAME

MERGE_RANGE

=head1 INHERITANCE

L<ELEMENT|Excel::Template::Element>

=head1 EFFECTS

This will merge a range of cells.

=head1 DEPENDENCIES

None

=head1 USAGE

  <cell ref="foo"/>
  <cell ref="foo"/>
  <cell ref="foo"/>
  <merge_range ref="foo">Text to insert into merged range</merge_range>

Or a cross rows:

  <row>
    <cell ref="foo"/>
    <cell ref="foo"/>
    <cell ref="foo"/>
  </row>
  <row>
    <cell ref="foo"/>
    <cell ref="foo"/>
    <cell ref="foo"/>
    <format>
      <merge_range ref="foo">Text to insert into merged range</merge_range>
    </format>
  </row>


=head1 AUTHOR

Stevan Little (stevan.little@iinteractive.com)

=head1 SEE ALSO

Nothing

=cut