Skip to content

Commit 52585a9

Browse files
authored
Hyperlinks and Namespacing (#2391)
Fix #2389. Hyperlinks referring to cells in the spreadsheet itself are not being handled properly. This is the first namespacing regression identified for release 19. Usual cause and fix - need to take greater care with attributes than was previously the case.
1 parent 4ac0c47 commit 52585a9

File tree

2 files changed

+58
-6
lines changed

2 files changed

+58
-6
lines changed

src/PhpSpreadsheet/Reader/Xlsx/Hyperlinks.php

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -47,17 +47,17 @@ private function setHyperlink(SimpleXMLElement $hyperlink, Worksheet $worksheet)
4747
$cell = $worksheet->getCell($cellReference);
4848
if (isset($linkRel['id'])) {
4949
$hyperlinkUrl = $this->hyperlinks[(string) $linkRel['id']] ?? null;
50-
if (isset($hyperlink['location'])) {
51-
$hyperlinkUrl .= '#' . (string) $hyperlink['location'];
50+
if (isset($attributes['location'])) {
51+
$hyperlinkUrl .= '#' . (string) $attributes['location'];
5252
}
5353
$cell->getHyperlink()->setUrl($hyperlinkUrl);
54-
} elseif (isset($hyperlink['location'])) {
55-
$cell->getHyperlink()->setUrl('sheet://' . (string) $hyperlink['location']);
54+
} elseif (isset($attributes['location'])) {
55+
$cell->getHyperlink()->setUrl('sheet://' . (string) $attributes['location']);
5656
}
5757

5858
// Tooltip
59-
if (isset($hyperlink['tooltip'])) {
60-
$cell->getHyperlink()->setTooltip((string) $hyperlink['tooltip']);
59+
if (isset($attributes['tooltip'])) {
60+
$cell->getHyperlink()->setTooltip((string) $attributes['tooltip']);
6161
}
6262
}
6363
}
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
<?php
2+
3+
namespace PhpOffice\PhpSpreadsheetTests\Reader\Xlsx;
4+
5+
use PhpOffice\PhpSpreadsheet\NamedRange;
6+
use PhpOffice\PhpSpreadsheet\Spreadsheet;
7+
use PhpOffice\PhpSpreadsheetTests\Functional\AbstractFunctional;
8+
9+
class HyperlinkTest extends AbstractFunctional
10+
{
11+
public function testReadAndWriteHyperlinks(): void
12+
{
13+
$spreadsheet = new Spreadsheet();
14+
$sheet1 = $spreadsheet->getActiveSheet();
15+
$sheet1->setTitle('Sheet One');
16+
$sheet1->getCell('A1')->setValue(100);
17+
$sheet1->getCell('B1')->setValue('this is b1');
18+
$spreadsheet->addNamedRange(new NamedRange('namedb1', $sheet1, '$B$1'));
19+
$sheet1->setCellValue('A2', 'link to same sheet');
20+
$sheet1->getCell('A2')->getHyperlink()->setUrl("sheet://'Sheet One'!A1");
21+
$sheet1->setCellValue('A3', 'link to defined name');
22+
$sheet1->getCell('A3')->getHyperlink()->setUrl('sheet://namedb1');
23+
24+
$sheet2 = $spreadsheet->createSheet();
25+
$sheet2->setTitle('Sheet Two');
26+
$sheet2->setCellValue('A2', 'link to other sheet');
27+
$sheet2->getCell('A2')->getHyperlink()->setUrl("sheet://'Sheet One'!A1");
28+
$sheet2->setCellValue('A3', 'external link');
29+
$sheet2->getCell('A3')->getHyperlink()->setUrl('https://www.example.com');
30+
$sheet2->setCellValue('A4', 'external link with anchor');
31+
$sheet2->getCell('A4')->getHyperlink()->setUrl('https://www.example.com#anchor');
32+
$sheet2->getCell('A4')->getHyperlink()->setTooltip('go to anchor tag on example.com');
33+
34+
$reloadedSpreadsheet = $this->writeAndReload($spreadsheet, 'Xlsx');
35+
$spreadsheet->disconnectWorksheets();
36+
$rsheet1 = $reloadedSpreadsheet->getSheet(0);
37+
self::assertSame('link to same sheet', $rsheet1->getCell('A2')->getValue());
38+
self::assertSame("sheet://'Sheet One'!A1", $rsheet1->getCell('A2')->getHyperlink()->getUrl());
39+
self::assertSame('link to defined name', $rsheet1->getCell('A3')->getValue());
40+
self::assertSame('sheet://namedb1', $rsheet1->getCell('A3')->getHyperlink()->getUrl());
41+
42+
$rsheet2 = $reloadedSpreadsheet->getSheet(1);
43+
self::assertSame('link to other sheet', $rsheet2->getCell('A2')->getValue());
44+
self::assertSame("sheet://'Sheet One'!A1", $rsheet2->getCell('A2')->getHyperlink()->getUrl());
45+
self::assertSame('external link', $rsheet2->getCell('A3')->getValue());
46+
self::assertSame('https://www.example.com', $rsheet2->getCell('A3')->getHyperlink()->getUrl());
47+
self::assertSame('https://www.example.com#anchor', $rsheet2->getCell('A4')->getHyperlink()->getUrl());
48+
self::assertSame('external link with anchor', $rsheet2->getCell('A4')->getValue());
49+
self::assertSame('go to anchor tag on example.com', $rsheet2->getCell('A4')->getHyperlink()->getToolTip());
50+
$reloadedSpreadsheet->disconnectWorksheets();
51+
}
52+
}

0 commit comments

Comments
 (0)