summaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/Spreadsheet/ParseXLSX.pm67
1 files changed, 46 insertions, 21 deletions
diff --git a/lib/Spreadsheet/ParseXLSX.pm b/lib/Spreadsheet/ParseXLSX.pm
index dca3c7c..4c446c9 100644
--- a/lib/Spreadsheet/ParseXLSX.pm
+++ b/lib/Spreadsheet/ParseXLSX.pm
@@ -1,7 +1,7 @@
package Spreadsheet::ParseXLSX;
use strict;
use warnings;
-use 5.010;
+use 5.008;
# ABSTRACT: parse XLSX files
use Archive::Zip;
@@ -178,13 +178,18 @@ sub _parse_workbook {
my @sheets = map {
my $idx = $_->att('r:id');
- my $sheet = Spreadsheet::ParseExcel::Worksheet->new(
- Name => $_->att('name'),
- _Book => $workbook,
- _SheetNo => $idx,
- );
- $self->_parse_sheet($sheet, $files->{sheets}{$idx});
- $sheet
+ if ($files->{sheets}{$idx}) {
+ my $sheet = Spreadsheet::ParseExcel::Worksheet->new(
+ Name => $_->att('name'),
+ _Book => $workbook,
+ _SheetNo => $idx,
+ );
+ $sheet->{SheetHidden} = 1 if defined $_->att('state') and $_->att('state') eq 'hidden';
+ $self->_parse_sheet($sheet, $files->{sheets}{$idx});
+ ($sheet)
+ } else {
+ ()
+ }
} $files->{workbook}->find_nodes('//sheets/sheet');
$workbook->{Worksheet} = \@sheets;
@@ -211,7 +216,9 @@ sub _parse_sheet {
my @column_formats;
my @column_widths;
+ my @columns_hidden;
my @row_heights;
+ my @rows_hidden;
my $default_row_height = 15;
my $default_column_width = 10;
@@ -252,7 +259,8 @@ sub _parse_sheet {
my ($twig, $margin) = @_;
map {
my $key = "\u${_}Margin";
- $sheet->{$key} = $margin->att($_) // 0
+ $sheet->{$key} = defined $margin->att($_)
+ ? $margin->att($_) : 0
} qw(left right top bottom header footer);
$twig->purge;
@@ -260,9 +268,13 @@ sub _parse_sheet {
'pageSetup' => sub {
my ($twig, $setup) = @_;
- $sheet->{Scale} = $setup->att('scale') // 100;
- $sheet->{Landscape} = ($setup->att('orientation') // '') ne 'landscape';
- $sheet->{PaperSize} = $setup->att('paperSize') // 1;
+ $sheet->{Scale} = defined $setup->att('scale')
+ ? $setup->att('scale')
+ : 100;
+ $sheet->{Landscape} = ($setup->att('orientation') || '') ne 'landscape';
+ $sheet->{PaperSize} = defined $setup->att('paperSize')
+ ? $setup->att('paperSize')
+ : 1;
$sheet->{PageStart} = $setup->att('firstPageNumber');
$sheet->{UsePage} = $self->_xml_boolean($setup->att('useFirstPageNumber'));
$sheet->{HorizontalDPI} = $setup->att('horizontalDpi');
@@ -297,8 +309,10 @@ sub _parse_sheet {
'sheetFormatPr' => sub {
my ( $twig, $format ) = @_;
- $default_row_height //= $format->att('defaultRowHeight');
- $default_column_width //= $format->att('baseColWidth');
+ $default_row_height = $format->att('defaultRowHeight')
+ unless defined $default_row_height;
+ $default_column_width = $format->att('baseColWidth')
+ unless defined $default_column_width;
$twig->purge;
},
@@ -309,6 +323,7 @@ sub _parse_sheet {
for my $colnum ($col->att('min')..$col->att('max')) {
$column_widths[$colnum - 1] = $col->att('width');
$column_formats[$colnum - 1] = $col->att('style');
+ $columns_hidden[$colnum - 1] = $col->att('hidden');
}
$twig->purge;
@@ -318,6 +333,7 @@ sub _parse_sheet {
my ( $twig, $row ) = @_;
$row_heights[ $row->att('r') - 1 ] = $row->att('ht');
+ $rows_hidden[ $row->att('r') - 1 ] = $row->att('hidden');
$twig->purge;
},
@@ -452,10 +468,12 @@ sub _parse_sheet {
$sheet->{RowHeight} = [
map { defined $_ ? 0+$_ : 0+$default_row_height } @row_heights
];
+ $sheet->{RowHidden} = \@rows_hidden;
$sheet->{ColWidth} = [
map { defined $_ ? 0+$_ : 0+$default_column_width } @column_widths
];
$sheet->{ColFmtNo} = \@column_formats;
+ $sheet->{ColHidden} = \@columns_hidden;
}
@@ -771,6 +789,7 @@ sub _extract_files {
my $wb_name = ($rels->find_nodes(
qq<//Relationship[\@Type="$type_base/officeDocument"]>
))[0]->att('Target');
+ $wb_name =~ s{^/}{};
my $wb_xml = $self->_parse_xml($zip, $wb_name);
my $path_base = $self->_base_path_for($wb_name);
@@ -779,25 +798,33 @@ sub _extract_files {
$self->_rels_for($wb_name)
);
+ my $get_path = sub {
+ my ($p) = @_;
+
+ return $p =~ s{^/}{}
+ ? $p
+ : $path_base . $p;
+ };
+
my ($strings_xml) = map {
- $zip->memberNamed($path_base . $_->att('Target'))->contents
+ $zip->memberNamed($get_path->($_->att('Target')))->contents
} $wb_rels->find_nodes(qq<//Relationship[\@Type="$type_base/sharedStrings"]>);
my $styles_xml = $self->_parse_xml(
$zip,
- $path_base . ($wb_rels->find_nodes(
+ $get_path->(($wb_rels->find_nodes(
qq<//Relationship[\@Type="$type_base/styles"]>
- ))[0]->att('Target')
+ ))[0]->att('Target'))
);
my %worksheet_xml = map {
- if ( my $sheetfile = $zip->memberNamed($path_base . $_->att('Target'))->contents ) {
+ if ( my $sheetfile = $zip->memberNamed($get_path->($_->att('Target')))->contents ) {
( $_->att('Id') => $sheetfile );
}
} $wb_rels->find_nodes(qq<//Relationship[\@Type="$type_base/worksheet"]>);
my %themes_xml = map {
- $_->att('Id') => $self->_parse_xml($zip, $path_base . $_->att('Target'))
+ $_->att('Id') => $self->_parse_xml($zip, $get_path->($_->att('Target')))
} $wb_rels->find_nodes(qq<//Relationship[\@Type="$type_base/theme"]>);
return {
@@ -1394,8 +1421,6 @@ although this may have other consequences such as memory leaks.
=item Intra-cell formatting is discarded
-=item Diagonal border styles are ignored
-
=back
In addition, there are still a few areas which are not yet implemented (the