From 44f6095337975eb5bc004a45e1147d0ba4652753 Mon Sep 17 00:00:00 2001 From: Stuart Watt Date: Tue, 1 Sep 2015 14:36:31 -0400 Subject: Don't parse sheets where there's no extracted file. See #38 See discussion at: https://github.com/doy/spreadsheet-parsexlsx/issues/38. The patch is a little different from the minimal one suggested initially, because we probably don't even want to return a sheet when we can't parse it. --- lib/Spreadsheet/ParseXLSX.pm | 18 +++++++++++------- t/bug-38.t | 11 +++++++++++ t/data/bug-38.xlsx | Bin 0 -> 12338 bytes 3 files changed, 22 insertions(+), 7 deletions(-) create mode 100644 t/bug-38.t create mode 100644 t/data/bug-38.xlsx diff --git a/lib/Spreadsheet/ParseXLSX.pm b/lib/Spreadsheet/ParseXLSX.pm index 1698acd..cb20013 100644 --- a/lib/Spreadsheet/ParseXLSX.pm +++ b/lib/Spreadsheet/ParseXLSX.pm @@ -110,13 +110,17 @@ 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, + ); + $self->_parse_sheet($sheet, $files->{sheets}{$idx}); + ($sheet) + } else { + () + } } $files->{workbook}->find_nodes('//sheets/sheet'); $workbook->{Worksheet} = \@sheets; diff --git a/t/bug-38.t b/t/bug-38.t new file mode 100644 index 0000000..fa61176 --- /dev/null +++ b/t/bug-38.t @@ -0,0 +1,11 @@ +#!/usr/bin/env perl +use strict; +use warnings; +use Test::More; + +use Spreadsheet::ParseXLSX; + +my $wb = Spreadsheet::ParseXLSX->new->parse('t/data/bug-38.xlsx'); +pass('it parses successfully'); + +done_testing; diff --git a/t/data/bug-38.xlsx b/t/data/bug-38.xlsx new file mode 100644 index 0000000..be360b4 Binary files /dev/null and b/t/data/bug-38.xlsx differ -- cgit v1.2.3-54-g00ecf