Skip to content

Commit 9c5bf34

Browse files
authored
Merge pull request #3923 from oleibman/issue3730
Unexpected Absolute Address in Xlsx Rels File
2 parents bea48f0 + 41dd6c3 commit 9c5bf34

File tree

3 files changed

+69
-2
lines changed

3 files changed

+69
-2
lines changed

src/PhpSpreadsheet/Reader/Xlsx.php

+6-2
Original file line numberDiff line numberDiff line change
@@ -570,7 +570,9 @@ protected function loadSpreadsheetFromFile(string $filename): Spreadsheet
570570
if ($xpath === null) {
571571
$xmlStyles = self::testSimpleXml(null);
572572
} else {
573-
$xmlStyles = $this->loadZip("$dir/$xpath[Target]", $mainNS);
573+
$stylesTarget = (string) $xpath['Target'];
574+
$stylesTarget = str_starts_with($stylesTarget, '/') ? substr($stylesTarget, 1) : "$dir/$stylesTarget";
575+
$xmlStyles = $this->loadZip($stylesTarget, $mainNS);
574576
}
575577

576578
$palette = self::extractPalette($xmlStyles);
@@ -689,7 +691,9 @@ protected function loadSpreadsheetFromFile(string $filename): Spreadsheet
689691
$xpath = self::getArrayItem($relsWorkbook->xpath($relType));
690692

691693
if ($xpath) {
692-
$xmlStrings = $this->loadZip("$dir/$xpath[Target]", $mainNS);
694+
$sharedStringsTarget = (string) $xpath['Target'];
695+
$sharedStringsTarget = str_starts_with($sharedStringsTarget, '/') ? substr($sharedStringsTarget, 1) : "$dir/$sharedStringsTarget";
696+
$xmlStrings = $this->loadZip($sharedStringsTarget, $mainNS);
693697
if (isset($xmlStrings->si)) {
694698
foreach ($xmlStrings->si as $val) {
695699
if (isset($val->t)) {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace PhpOffice\PhpSpreadsheetTests\Reader\Xlsx;
6+
7+
use PhpOffice\PhpSpreadsheet\Reader\Xlsx;
8+
9+
class Issue3730Test extends \PHPUnit\Framework\TestCase
10+
{
11+
private static string $testbook = 'tests/data/Reader/XLSX/issue.3730.xlsx';
12+
13+
public function testPreliminaries(): void
14+
{
15+
$file = 'zip://';
16+
$file .= self::$testbook;
17+
$file .= '#xl\\_rels\\workbook.xml.rels'; // no idea why backslash
18+
$data = file_get_contents($file);
19+
// confirm that file contains expected absolute reference
20+
if ($data === false) {
21+
self::fail('Unable to read file');
22+
} else {
23+
self::assertStringContainsString('Target="/xl/sharedStrings.xml"', $data);
24+
self::assertStringContainsString('Target="/xl/styles.xml"', $data);
25+
self::assertStringContainsString('Target="/xl/worksheets/sheet0.xml"', $data);
26+
}
27+
}
28+
29+
public function testInfo(): void
30+
{
31+
$reader = new Xlsx();
32+
$workSheetInfo = $reader->listWorkSheetInfo(self::$testbook);
33+
$info1 = $workSheetInfo[0];
34+
self::assertEquals('promedia postlogs wk 2-12', $info1['worksheetName']);
35+
self::assertEquals('O', $info1['lastColumnLetter']);
36+
self::assertEquals(14, $info1['lastColumnIndex']);
37+
self::assertEquals(99, $info1['totalRows']);
38+
self::assertEquals(15, $info1['totalColumns']);
39+
}
40+
41+
public function testSheetNames(): void
42+
{
43+
$reader = new Xlsx();
44+
$worksheetNames = $reader->listWorksheetNames(self::$testbook);
45+
$expected = [
46+
'promedia postlogs wk 2-12',
47+
];
48+
self::assertEquals($expected, $worksheetNames);
49+
}
50+
51+
public function testLoadXlsx(): void
52+
{
53+
$reader = new Xlsx();
54+
$spreadsheet = $reader->load(self::$testbook);
55+
$sheets = $spreadsheet->getAllSheets();
56+
self::assertCount(1, $sheets);
57+
$sheet = $spreadsheet->getSheetByNameOrThrow('promedia postlogs wk 2-12');
58+
self::assertSame('ProMedia Group - DR', $sheet->getCell('G7')->getValue());
59+
self::assertSame('Arial', $sheet->getStyle('G7')->getFont()->getName());
60+
self::assertEquals(8, $sheet->getStyle('G7')->getFont()->getSize());
61+
$spreadsheet->disconnectWorksheets();
62+
}
63+
}
10.9 KB
Binary file not shown.

0 commit comments

Comments
 (0)