mirror of
https://github.com/PHPOffice/PhpSpreadsheet.git
synced 2026-09-18 14:06:34 +00:00
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:
@@ -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();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user