summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJesse Luehrs <doy@tozt.net>2015-12-03 23:58:34 -0500
committerJesse Luehrs <doy@tozt.net>2015-12-03 23:58:34 -0500
commit7c03981994402a173c3332b429239d01f7ec71b2 (patch)
treecb8975e4e6a196418141986aba8aa152d3566f5d
parent2524f3b910282998be8fb967eb90d50a7f38ec3f (diff)
parentaef74127ef74114e7fb30d16037b810ed93635d7 (diff)
downloadspreadsheet-parsexlsx-7c03981994402a173c3332b429239d01f7ec71b2.tar.gz
spreadsheet-parsexlsx-7c03981994402a173c3332b429239d01f7ec71b2.zip
Merge pull request #46 from zhouzhen1/target_abspath
-rw-r--r--lib/Spreadsheet/ParseXLSX.pm21
-rw-r--r--t/data/target-abspath.xlsxbin0 -> 6927 bytes
-rw-r--r--t/target-abspath.t17
3 files changed, 33 insertions, 5 deletions
diff --git a/lib/Spreadsheet/ParseXLSX.pm b/lib/Spreadsheet/ParseXLSX.pm
index ad7f54c..f8daaae 100644
--- a/lib/Spreadsheet/ParseXLSX.pm
+++ b/lib/Spreadsheet/ParseXLSX.pm
@@ -714,6 +714,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);
@@ -722,25 +723,35 @@ sub _extract_files {
$self->_rels_for($wb_name)
);
+ my $get_path = sub {
+ my ($p) = @_;
+ if ($p !~ /^\//) {
+ return $path_base . $p;
+ } else {
+ $p =~ s/^\///;
+ return $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 {
diff --git a/t/data/target-abspath.xlsx b/t/data/target-abspath.xlsx
new file mode 100644
index 0000000..2ca7970
--- /dev/null
+++ b/t/data/target-abspath.xlsx
Binary files differ
diff --git a/t/target-abspath.t b/t/target-abspath.t
new file mode 100644
index 0000000..e79445b
--- /dev/null
+++ b/t/target-abspath.t
@@ -0,0 +1,17 @@
+#!/usr/bin/env perl
+use strict;
+use warnings;
+use Test::More;
+
+use Spreadsheet::ParseXLSX;
+
+my $wb;
+eval {
+ $wb = Spreadsheet::ParseXLSX->new->parse('t/data/target-abspath.xlsx');
+};
+if ($@) {
+ diag $@;
+}
+ok((not $@), "parsing target-abspath.xlsx ok");
+
+done_testing;