Skip to content

Commit 41dd6c3

Browse files
committed
Unexpected Absolute Address in Xlsx Rels File
Fix #3730. File workbook.xml.rels in test file specified absolute addressing for shared strings, styles, and worksheets. Previous changes had addressed absolute addressing for worksheets, but shared strings and styles had not yet been addressed.
1 parent d620497 commit 41dd6c3

File tree

3 files changed

+69
-2
lines changed

3 files changed

+69
-2
lines changed

src/PhpSpreadsheet/Reader/Xlsx.php

Lines changed: 6 additions & 2 deletions
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)) {
Lines changed: 63 additions & 0 deletions
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)