diff options
-rw-r--r-- | .travis.yml | 2 | ||||
-rw-r--r-- | lib/Spreadsheet/ParseXLSX.pm | 50 | ||||
-rw-r--r-- | t/bug-16.t (renamed from t/bug-lock.t) | 2 | ||||
-rw-r--r-- | t/bug-17.t | 14 | ||||
-rw-r--r-- | t/data/bug-16.xlsx (renamed from t/data/bug-lock.xlsx) | bin | 8480 -> 8480 bytes | |||
-rw-r--r-- | t/data/bug-17a.xlsx | bin | 0 -> 7825 bytes | |||
-rw-r--r-- | t/data/bug-17b.xlsx | bin | 0 -> 7817 bytes | |||
-rw-r--r-- | t/data/page-Setup.xlsx | bin | 0 -> 9185 bytes | |||
-rw-r--r-- | t/page-Setup.t | 40 |
9 files changed, 103 insertions, 5 deletions
diff --git a/.travis.yml b/.travis.yml index 655229f..e649e7e 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,6 +1,6 @@ language: perl perl: - - "5.19" + - "5.20" - "5.18" - "5.16" - "5.14" diff --git a/lib/Spreadsheet/ParseXLSX.pm b/lib/Spreadsheet/ParseXLSX.pm index 26269fd..7f9b4ef 100644 --- a/lib/Spreadsheet/ParseXLSX.pm +++ b/lib/Spreadsheet/ParseXLSX.pm @@ -82,7 +82,7 @@ sub _parse_workbook { : ("")); } - $workbook->{Flag1904} = $properties && $properties->att('date1904') ? 1 : 0; + $workbook->{Flg1904} = $properties && $properties->att('date1904') ? 1 : 0; $workbook->{FmtClass} = $formatter || Spreadsheet::ParseExcel::FmtDefault->new; @@ -164,6 +164,38 @@ sub _parse_sheet { $twig->purge; }, + 'headerFooter' => sub { + my ($twig, $hf) = @_; + + my ($helem, $felem) = map { + $hf->first_child($_) + } qw(oddHeader oddFooter); + $sheet->{header} = $helem->text + if $helem; + $sheet->{footer} = $felem->text + if $felem; + + $twig->purge; + }, + + 'pageMargins' => sub { + my ($twig, $margin) = @_; + map { + $sheet->{pageMargins}->{$_} = $margin->att($_) // 0 + } qw(left right top bottom header footer); + + $twig->purge; + }, + + 'pageSetup' => sub { + my ($twig, $setup) = @_; + map { + $sheet->{pageSetup}->{$_} = $setup->att($_) // 0 + } qw(scale orientation horizontalDpi verticalDpi paperSize firstPageNumber scale); + + $twig->purge; + }, + 'mergeCells/mergeCell' => sub { my ( $twig, $merge_area ) = @_; @@ -469,6 +501,12 @@ sub _parse_styles { my @borders = map { my $border = $_; + my ($ddiag, $udiag) = map { + my $v = $border->att($_) // 0; + $v = 1 if $v eq 'true'; + $v = 0 if $v eq 'false'; + $v + } qw(diagonalDown diagonalUp); # XXX specs say "begin" and "end" rather than "left" and "right", # but... that's not what seems to be in the file itself (sigh) { @@ -486,8 +524,11 @@ sub _parse_styles { } qw(left right top bottom) ], diagonal => [ - 0, # XXX ->att('diagonalDown') and ->att('diagonalUp') - 0, # XXX ->att('style') + ( $ddiag && $udiag ? 3 + : $ddiag && !$udiag ? 2 + : !$ddiag && $udiag ? 1 + : 0), + $border{$border->first_child('diagonal')->att('style') || 'none'}, $self->_color( $workbook->{Color}, $border->first_child('diagonal')->first_child('color') @@ -615,9 +656,12 @@ sub _parse_styles { : 2, # JustLast => $iJustL, # Rotate => $iRotate, + Rotate => $alignment ? $alignment->att('textRotation') : 0, # Indent => $iInd, + Indent => $alignment ? $alignment->att('indent') : 0, # Shrink => $iShrink, + Shrink => $alignment ? $alignment->att('shrinkToFit') : 0, # Merge => $iMerge, # ReadDir => $iReadDir, diff --git a/t/bug-lock.t b/t/bug-16.t index 142d003..8ee9b6d 100644 --- a/t/bug-lock.t +++ b/t/bug-16.t @@ -5,7 +5,7 @@ use Test::More; use Spreadsheet::ParseXLSX; -my $wb = Spreadsheet::ParseXLSX->new->parse('t/data/bug-lock.xlsx'); +my $wb = Spreadsheet::ParseXLSX->new->parse('t/data/bug-16.xlsx'); my $ws = $wb->worksheet(0); my $b1 = $ws->get_cell(0, 0); diff --git a/t/bug-17.t b/t/bug-17.t new file mode 100644 index 0000000..fb77b26 --- /dev/null +++ b/t/bug-17.t @@ -0,0 +1,14 @@ +#!/usr/bin/env perl +use strict; +use warnings; +use Test::More; + +use Spreadsheet::ParseXLSX; + +my $wba = Spreadsheet::ParseXLSX->new->parse('t/data/bug-17a.xlsx'); +ok($wba->using_1904_date); + +my $wbb = Spreadsheet::ParseXLSX->new->parse('t/data/bug-17b.xlsx'); +ok(!$wbb->using_1904_date); + +done_testing; diff --git a/t/data/bug-lock.xlsx b/t/data/bug-16.xlsx Binary files differindex bf16fdb..bf16fdb 100644 --- a/t/data/bug-lock.xlsx +++ b/t/data/bug-16.xlsx diff --git a/t/data/bug-17a.xlsx b/t/data/bug-17a.xlsx Binary files differnew file mode 100644 index 0000000..7d8680c --- /dev/null +++ b/t/data/bug-17a.xlsx diff --git a/t/data/bug-17b.xlsx b/t/data/bug-17b.xlsx Binary files differnew file mode 100644 index 0000000..f58508a --- /dev/null +++ b/t/data/bug-17b.xlsx diff --git a/t/data/page-Setup.xlsx b/t/data/page-Setup.xlsx Binary files differnew file mode 100644 index 0000000..b0383a3 --- /dev/null +++ b/t/data/page-Setup.xlsx diff --git a/t/page-Setup.t b/t/page-Setup.t new file mode 100644 index 0000000..71cca22 --- /dev/null +++ b/t/page-Setup.t @@ -0,0 +1,40 @@ +#!/usr/bin/env perl +use strict; +use warnings; +use Test::More; + +use Spreadsheet::ParseXLSX; + +my $wb = Spreadsheet::ParseXLSX->new->parse('t/data/page-Setup.xlsx'); + +my $ws1 = $wb->worksheet(0); + +# Header/Footer Text +is($ws1->{header}, '&CHeader'); +is($ws1->{footer}, '&CFooter'); + +# Margins +is($ws1->{pageMargins}{header}, '0.3'); +is($ws1->{pageMargins}{footer}, '0.4'); +is($ws1->{pageMargins}{left}, '0.5'); +is($ws1->{pageMargins}{right}, '0.6'); +is($ws1->{pageMargins}{top}, '0.7'); +is($ws1->{pageMargins}{bottom}, '0.8'); + +# Page Setup +is($ws1->{pageSetup}{scale}, '75'); +is($ws1->{pageSetup}{orientation}, 'landscape'); +is($ws1->{pageSetup}{paperSize}, '4'); # Code for 11*17 + +# Cell Border Formatting +is($ws1->get_cell(0,0)->get_format()->{'BdrDiag'}[0], 1); +is($ws1->get_cell(0,1)->get_format()->{'BdrDiag'}[0], 2); +is($ws1->get_cell(0,2)->get_format()->{'BdrDiag'}[0], 3); +is($ws1->get_cell(0,0)->get_format()->{'BdrDiag'}[1], 6); # Double Line +is($ws1->get_cell(0,0)->get_format()->{'BdrDiag'}[2], '#FF0000'); # Red + +is($ws1->get_cell(2,0)->get_format()->{'Rotate'}, 90); +is($ws1->get_cell(3,0)->get_format()->{'Shrink'}, 1); +is($ws1->get_cell(4,0)->get_format()->{'Indent'}, 1); + +done_testing; |