summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJesse Luehrs <doy@tozt.net>2014-07-05 14:16:19 -0400
committerJesse Luehrs <doy@tozt.net>2014-07-05 14:16:19 -0400
commit063a3ed5650df0e84af5ddfc3c909077d04159d5 (patch)
treefee9aa7b23946e8fe7cd486d8a95f1da1a91ab3f
parenta723723da2f4f7155f2f01f42c2502cb65f71b4b (diff)
parent5bfde2e914636f99e5994c843dd158f6804e5db5 (diff)
downloadspreadsheet-parsexlsx-063a3ed5650df0e84af5ddfc3c909077d04159d5.tar.gz
spreadsheet-parsexlsx-063a3ed5650df0e84af5ddfc3c909077d04159d5.zip
Merge branch 'pull-25'
-rw-r--r--lib/Spreadsheet/ParseXLSX.pm15
-rw-r--r--t/bug-15.t2
-rw-r--r--t/bug-lock.t26
-rw-r--r--t/data/bug-lock.xlsxbin0 -> 8480 bytes
4 files changed, 35 insertions, 8 deletions
diff --git a/lib/Spreadsheet/ParseXLSX.pm b/lib/Spreadsheet/ParseXLSX.pm
index 72c8793..99d3c33 100644
--- a/lib/Spreadsheet/ParseXLSX.pm
+++ b/lib/Spreadsheet/ParseXLSX.pm
@@ -33,17 +33,18 @@ sub new {
bless {}, shift;
}
-=method parse($file)
+=method parse($file, $formatter)
Parses an XLSX file. Parsing errors throw an exception. C<$file> can be either
a filename or an open filehandle. Returns a
L<Spreadsheet::ParseExcel::Workbook> instance containing the parsed data.
+The C<$formatter> argument is an optional formatter class as described in L<Spreadsheet::ParseExcel>.
=cut
sub parse {
my $self = shift;
- my ($file) = @_;
+ my ($file, $formatter) = @_;
my $zip = Archive::Zip->new;
my $workbook = Spreadsheet::ParseExcel::Workbook->new;
@@ -62,12 +63,12 @@ sub parse {
die "Argument to 'new' must be a filename or open filehandle";
}
- return $self->_parse_workbook($zip, $workbook);
+ return $self->_parse_workbook($zip, $workbook, $formatter);
}
sub _parse_workbook {
my $self = shift;
- my ($zip, $workbook) = @_;
+ my ($zip, $workbook, $formatter) = @_;
my $files = $self->_extract_files($zip);
@@ -81,7 +82,7 @@ sub _parse_workbook {
$workbook->{Flag1904} = $properties->att('date1904') ? 1 : 0;
- $workbook->{FmtClass} = Spreadsheet::ParseExcel::FmtDefault->new; # XXX
+ $workbook->{FmtClass} = $formatter || Spreadsheet::ParseExcel::FmtDefault->new;
my $themes = $self->_parse_themes((values %{ $files->{themes} })[0]); # XXX
@@ -573,9 +574,9 @@ sub _parse_styles {
Font => $font[$_->att('fontId')],
FmtIdx => 0+$_->att('numFmtId'),
- Lock => $protection
+ Lock => $protection && defined $protection->att('locked')
? $protection->att('locked')
- : 0,
+ : 1,
Hidden => $protection
? $protection->att('hidden')
: 0,
diff --git a/t/bug-15.t b/t/bug-15.t
index 47322e8..4c7710a 100644
--- a/t/bug-15.t
+++ b/t/bug-15.t
@@ -13,7 +13,7 @@ ok(exists $b2->get_format->{Hidden});
ok(exists $b2->get_format->{Lock});
ok($b2->get_format->{IgnoreProtection});
ok(!$b2->get_format->{Hidden});
-ok(!$b2->get_format->{Lock});
+ok($b2->get_format->{Lock});
my $b3 = $ws->get_cell(2, 1);
ok(exists $b3->get_format->{Hidden});
diff --git a/t/bug-lock.t b/t/bug-lock.t
new file mode 100644
index 0000000..142d003
--- /dev/null
+++ b/t/bug-lock.t
@@ -0,0 +1,26 @@
+#!/usr/bin/env perl
+use strict;
+use warnings;
+use Test::More;
+
+use Spreadsheet::ParseXLSX;
+
+my $wb = Spreadsheet::ParseXLSX->new->parse('t/data/bug-lock.xlsx');
+my $ws = $wb->worksheet(0);
+
+my $b1 = $ws->get_cell(0, 0);
+ok($b1->get_format->{Lock});
+
+my $b2 = $ws->get_cell(1, 0);
+ok(!$b2->get_format->{Lock});
+
+my $b3 = $ws->get_cell(2, 0);
+ok($b3->get_format->{Lock});
+
+my $b4 = $ws->get_cell(3, 0);
+ok(!$b4->get_format->{Lock});
+
+my $b5 = $ws->get_cell(4, 0);
+ok($b5->get_format->{Lock});
+
+done_testing;
diff --git a/t/data/bug-lock.xlsx b/t/data/bug-lock.xlsx
new file mode 100644
index 0000000..bf16fdb
--- /dev/null
+++ b/t/data/bug-lock.xlsx
Binary files differ