From 529f114e86dfd360db60df22bbb75830b219b12a Mon Sep 17 00:00:00 2001 From: Jesse Luehrs Date: Sat, 25 Jun 2016 13:59:34 -0400 Subject: support scalar refs as inputs too for compatibility with Spreadsheet::ParseExcel --- lib/Spreadsheet/ParseXLSX.pm | 12 +++++++++++- t/basic.t | 8 +++++++- t/encryption.t | 35 ++++++++++++++++++++++++++--------- 3 files changed, 44 insertions(+), 11 deletions(-) diff --git a/lib/Spreadsheet/ParseXLSX.pm b/lib/Spreadsheet/ParseXLSX.pm index c38cfc2..0ffbc43 100644 --- a/lib/Spreadsheet/ParseXLSX.pm +++ b/lib/Spreadsheet/ParseXLSX.pm @@ -88,13 +88,20 @@ sub parse { $workbook->{File} = undef; $workbook->{__tempfile} = $file; } + elsif (ref($file) eq 'SCALAR') { + open my $fh, '+<', $file + or die "Can't create filehandle from memory data"; + $zip->readFromFileHandle($fh) == Archive::Zip::AZ_OK + or die "Can't open scalar ref as a zip file"; + $workbook->{File} = undef; + } elsif (!ref($file)) { $zip->read($file) == Archive::Zip::AZ_OK or die "Can't open file '$file' as a zip file"; $workbook->{File} = $file; } else { - die "Argument to 'new' must be a filename or open filehandle"; + die "Argument to 'new' must be a filename, open filehandle, or scalar ref"; } return $self->_parse_workbook($zip, $workbook, $formatter); @@ -110,6 +117,9 @@ sub _check_signature { $file->read($signature, 2); $file->seek(-2, IO::File::SEEK_CUR); } + elsif (ref($file) eq 'SCALAR') { + $signature = substr($$file, 0, 2); + } elsif (!ref($file)) { my $fh = IO::File->new($file, 'r'); $fh->read($signature, 2); diff --git a/t/basic.t b/t/basic.t index dde23e6..a024619 100644 --- a/t/basic.t +++ b/t/basic.t @@ -7,7 +7,13 @@ use Spreadsheet::ParseXLSX; my $filename = 't/data/Test.xlsx'; -for my $file ($filename, do { open my $fh, '<', $filename or die; $fh }) { +my @inputs = ( + $filename, + do { open my $fh, '<', $filename or die; $fh }, + do { open my $fh, '<', $filename or die; local $/; my $d = <$fh>; \$d }, +); + +for my $file (@inputs) { my $wb = Spreadsheet::ParseXLSX->new->parse($file); isa_ok($wb, 'Spreadsheet::ParseExcel::Workbook'); diff --git a/t/encryption.t b/t/encryption.t index 77f7c38..594701b 100644 --- a/t/encryption.t +++ b/t/encryption.t @@ -6,22 +6,39 @@ use Test::More; use Spreadsheet::ParseXLSX; { + my $filename = 't/data/encryption-agile-123q.xlsx'; + my @inputs = ( + $filename, + do { open my $fh, '<', $filename or die; $fh }, + do { open my $fh, '<', $filename or die; local $/; my $d = <$fh>; \$d }, + ); + my $parser = Spreadsheet::ParseXLSX->new(Password => '123q'); - my $workbook = $parser->parse("t/data/encryption-agile-123q.xlsx"); + for my $input (@inputs) { + my $workbook = $parser->parse($input); - my $worksheet = $workbook->worksheet(0); - my $cell = $worksheet->get_cell(1, 1); - is($cell->value, 'abcdefgABCDEFG'); + my $worksheet = $workbook->worksheet(0); + my $cell = $worksheet->get_cell(1, 1); + is($cell->value, 'abcdefgABCDEFG'); + } } { - open my $fh, "t/data/encryption-standard-default-password.xlsx" or die; + my $filename = 't/data/encryption-standard-default-password.xlsx'; + my @inputs = ( + $filename, + do { open my $fh, '<', $filename or die; $fh }, + do { open my $fh, '<', $filename or die; local $/; my $d = <$fh>; \$d }, + ); + my $parser = Spreadsheet::ParseXLSX->new(Password => ''); - my $workbook = $parser->parse($fh); + for my $input (@inputs) { + my $workbook = $parser->parse($input); - my $worksheet = $workbook->worksheet(0); - my $cell = $worksheet->get_cell(22, 8); - is($cell->value, 1911); + my $worksheet = $workbook->worksheet(0); + my $cell = $worksheet->get_cell(22, 8); + is($cell->value, 1911); + } } done_testing; -- cgit v1.2.3