Option to Write Hyperlink Rather than Label to Csv

Fix #1412 which had gone stale and which I've reopened. Add boolean property `preferHyperlinkToLabel` with setter and getter to Csv Writer. Default is false, so no BC problems; in addition, true will probably add quite a bit of overhead.
This commit is contained in:
Owen Leibman
2024-08-26 12:56:27 -07:00
parent e1dae99a70
commit 1618607b96
2 changed files with 77 additions and 0 deletions
+28
View File
@@ -62,6 +62,8 @@ class Csv extends BaseWriter
*/
private bool $variableColumns = false;
private bool $preferHyperlinkToLabel = false;
/**
* Create a new CSV.
*/
@@ -123,6 +125,14 @@ class Csv extends BaseWriter
array_splice($cellsArray, Coordinate::columnIndexFromString($column));
}
}
if ($this->preferHyperlinkToLabel) {
foreach ($cellsArray as $key => $value) {
$url = $sheet->getCell([$key + 1, $row])->getHyperlink()->getUrl();
if ($url !== '') {
$cellsArray[$key] = $url;
}
}
}
$this->writeLine($this->fileHandle, $cellsArray);
}
@@ -341,4 +351,22 @@ class Csv extends BaseWriter
return $this;
}
/**
* Get whether hyperlink or label should be output.
*/
public function getPreferHyperlinkToLabel(): bool
{
return $this->preferHyperlinkToLabel;
}
/**
* Set whether hyperlink or label should be output.
*/
public function setPreferHyperlinkToLabel(bool $preferHyperlinkToLabel): self
{
$this->preferHyperlinkToLabel = $preferHyperlinkToLabel;
return $this;
}
}
@@ -0,0 +1,49 @@
<?php
declare(strict_types=1);
namespace PhpOffice\PhpSpreadsheetTests\Writer\Csv;
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Csv;
use PHPUnit\Framework\TestCase;
class HyperlinkTest extends TestCase
{
public function testVariableColumns(): void
{
$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();
$sheet->setCellValue('A1', 3);
$sheet->setCellValue('B1', 4);
$sheet->setCellValue('C1', 5);
$sheet->setCellValue('A2', 6);
$sheet->setCellValue('B2', 'hyperlink');
$sheet->getCell('B2')->getHyperlink()
->setUrl('http://www.example.com');
$sheet->setCellValue('C2', 8);
$fh = fopen('php://memory', 'r+b');
self::assertNotFalse($fh);
$writer = new Csv($spreadsheet);
self::assertFalse($writer->getPreferHyperlinkToLabel());
$writer->setEnclosureRequired(false)->setLineEnding("\n");
$writer->save($fh);
rewind($fh);
self::assertSame(
"3,4,5\n6,hyperlink,8\n",
stream_get_contents($fh)
);
rewind($fh);
$writer->setPreferHyperlinkToLabel(true);
$writer->save($fh);
rewind($fh);
self::assertSame(
"3,4,5\n6,http://www.example.com,8\n",
stream_get_contents($fh)
);
fclose($fh);
$spreadsheet->disconnectWorksheets();
}
}