Excel-Template-XLSX
view release on metacpan or search on metacpan
lib/Excel/Template/XLSX.pm view on Meta::CPAN
'double' => 2,
'singleAccounting' => 33,
'doubleAccounting' => 34,
};
if ( defined $u ) {
# XXX sometimes style xml files can contain just <u/> with no
# val attribute. i think this means single underline, but not sure
my $underline = $u->att('val') // 'single';
$font->{'underline'} = $u_map->{$underline} if $underline;
}
my $font_name = $_->first_child('name');
$font->{'font'} = $font_name->att('val') if $font_name;
# Alternate for rich strings (embedded font)
my $rFont = $_->first_child('rFont');
$font->{'font'} = $rFont->att('val') if $rFont;
my $bold = $_->first_child('b');
$font->{'bold'} = 1 if $bold;
my $italic = $_->first_child('i');
$font->{'italic'} = 1 if $italic;
my $strike = $_->first_child('strike');
$font->{'font_strikeout'} = 1 if $strike;
$font;
} $styles->find_nodes($xpath);
return $fonts;
}
###############################################################################
sub _parse_numbers {
=head2 _parse_numbers
Parses styles for cell number formats (financial, decimal, exponential, date-time, ...)
=cut
my $self = shift;
my ($styles) = @_;
my $number_format = { 0 => {} };
map {
my $id = $_->att('numFmtId') // 0;
# defaults are from
#http://social.msdn.microsoft.com/Forums/en-US/oxmlsdk/thread/e27aaf16-b900-4654-8210-83c5774a179c
# Defaults do not need to be re-created.
my $code = $_->att('formatCode') // $id;
$number_format->{$id} = { num_format => $code } if $id;
} $styles->find_nodes('//numFmts/numFmt');
return $number_format;
}
###############################################################################
sub _parse_protection {
=head2 _parse_protection
Parses locked and hidden attributes for a cell. These are only
useful if the worksheet is locked.
This module does not lock the workbook or the worksheet.
=cut
my $self = shift;
my ($node) = @_;
my @protection = qw(locked hidden);
my %prot = ();
if ( my $protection = $_->first_child('protection') ) {
map {
my $v = $protection->att($_);
$prot{$_} = $v if defined $v;
} @protection;
}
return %prot;
}
###############################################################################
sub _parse_shared_strings {
=head2 _parse_shared_strings
Parses the shared strings file. Excel does not directly store
string values with the cell, but stores an index into the shared
strings table instead, to save memory, if a string value is
referenced more than once. Shared strings also contain
formatting if multiple formats are applied within a cell (See
write_rich_string in EWX.
=cut
my $self = shift;
my ($strings) = @_;
return unless $strings;
my $xml = XML::Twig->new(
twig_handlers => {
'si' => sub {
my ( $twig, $si ) = @_;
my $callback = $self->{template_callback};
my $call = ref($callback) eq 'CODE';
# plain text strings
my $t = $si->first_child('t');
if ($t) {
my $text = $t->text();
$call and $self->$callback( \$text );
push @{ $self->{SHARED_STRINGS} }, $text;
}
# rich text strings; String item (si) with multiple
# text elements, with optional formatting
my $rich = [];
for my $r ( $si->find_nodes('r') ) {
my $text = $r->first_child('t')->text();
$call and $self->$callback( \$text );
my $rPr = $r->first_child('rPr');
if ($rPr) {
my $xml = $r->first_child('rPr')->outer_xml();
my $twig = XML::Twig->parse($xml);
my $fonts = $self->_parse_fonts( $twig, '//rPr' );
my $format = $self->{EWX}->add_format( %{ $fonts->[0] } );
push @$rich, $format, $text;
}
else {
push @$rich, $text;
( run in 0.541 second using v1.01-cache-2.11-cpan-f52f0507bed )