diff --git a/docs/topics/reading-and-writing-to-file.md b/docs/topics/reading-and-writing-to-file.md index f8ba084b..e55471a7 100644 --- a/docs/topics/reading-and-writing-to-file.md +++ b/docs/topics/reading-and-writing-to-file.md @@ -707,7 +707,7 @@ $sty = $writer->generateStyles(false); // do not write $newstyle = << $sty -html { +body { background-color: yellow; } @@ -717,16 +717,22 @@ echo $writer->generateSheetData(); echo $writer->generateHTMLFooter(); ``` -#### Writing UTF-8 HTML files +#### Editing HTML during save via a callback -A HTML file can be marked as UTF-8 by writing a BOM file header. This -can be enabled by using the following code: +You can also add a callback function to edit the generated html +before saving. For example, you could change the gridlines +from a thin solid black line: -```php +``` php +function changeGridlines(string $html): string +{ + return str_replace('{border: 1px solid black;}', + '{border: 2px dashed red;}', + $html); +} $writer = new \PhpOffice\PhpSpreadsheet\Writer\Html($spreadsheet); -$writer->setUseBOM(true); - -$writer->save("05featuredemo.htm"); +$writer->setEditHtmlCallback('changeGridlines'); +$writer->save($filename); ``` #### Decimal and thousands separators @@ -855,6 +861,12 @@ $writer->setPreCalculateFormulas(false); $writer->save("05featuredemo.pdf"); ``` +#### Editing Pdf during save via a callback + +You can also add a callback function to edit the html used to +generate the Pdf before saving. +[See under Html](#editing-html-during-save-via-a-callback). + #### Decimal and thousands separators See section `\PhpOffice\PhpSpreadsheet\Writer\Csv` how to control the diff --git a/samples/Basic/17b_Html.php b/samples/Basic/17b_Html.php new file mode 100644 index 00000000..97bb29a3 --- /dev/null +++ b/samples/Basic/17b_Html.php @@ -0,0 +1,20 @@ +getFilename(__FILE__, 'html'); +$writer = new Html($spreadsheet); + +function changeGridlines(string $html): string +{ + return str_replace('{border: 1px solid black;}', '{border: 2px dashed red;}', $html); +} + +$callStartTime = microtime(true); +$writer->setEmbedImages(true); +$writer->setEditHtmlCallback('changeGridlines'); +$writer->save($filename); +$helper->logWrite($writer, $filename, $callStartTime); diff --git a/samples/Pdf/21a_Pdf.php b/samples/Pdf/21a_Pdf.php new file mode 100644 index 00000000..b5572afe --- /dev/null +++ b/samples/Pdf/21a_Pdf.php @@ -0,0 +1,25 @@ +log('Hide grid lines'); +$spreadsheet->getActiveSheet()->setShowGridLines(false); + +$helper->log('Set orientation to landscape'); +$spreadsheet->getActiveSheet()->getPageSetup()->setOrientation(PageSetup::ORIENTATION_LANDSCAPE); +$spreadsheet->setActiveSheetIndex(0)->setPrintGridlines(true); + +function changeGridlines(string $html): string +{ + return str_replace('{border: 1px solid black;}', '{border: 2px dashed red;}', $html); +} + +$helper->log('Write to Mpdf'); +$writer = new Mpdf($spreadsheet); +$filename = $helper->getFileName('21a_Pdf_mpdf.xlsx', 'pdf'); +$writer->setEditHtmlCallback('changeGridlines'); +$writer->save($filename); diff --git a/samples/Pdf/21b_Pdf.php b/samples/Pdf/21b_Pdf.php new file mode 100644 index 00000000..c67ff3d2 --- /dev/null +++ b/samples/Pdf/21b_Pdf.php @@ -0,0 +1,51 @@ +.*~ms'; + $bodyrepl = << +

Serif

+

$lorem

+

Sans-Serif

+

$lorem

+

Monospace

+

$lorem

+ +EOF; + + return preg_replace($bodystring, $bodyrepl, $html); +} + +require __DIR__ . '/../Header.php'; +$spreadsheet = require __DIR__ . '/../templates/sampleSpreadsheet.php'; + +$helper->log('Hide grid lines'); +$spreadsheet->getActiveSheet()->setShowGridLines(false); + +$helper->log('Set orientation to landscape'); +$spreadsheet->getActiveSheet()->getPageSetup()->setOrientation(PageSetup::ORIENTATION_LANDSCAPE); + +$helper->log('Write to Dompdf'); +$writer = new Dompdf($spreadsheet); +$filename = $helper->getFileName('21b_Pdf_dompdf.xlsx', 'pdf'); +$writer->setEditHtmlCallback('replaceBody'); +$writer->save($filename); + +$helper->log('Write to Mpdf'); +$writer = new Mpdf($spreadsheet); +$filename = $helper->getFileName('21b_Pdf_mpdf.xlsx', 'pdf'); +$writer->setEditHtmlCallback('replaceBody'); +$writer->save($filename); + +$helper->log('Write to Tcpdf'); +$writer = new Tcpdf($spreadsheet); +$filename = $helper->getFileName('21b_Pdf_tcpdf.xlsx', 'pdf'); +$writer->setEditHtmlCallback('replaceBody'); +$writer->save($filename); diff --git a/src/PhpSpreadsheet/Writer/Html.php b/src/PhpSpreadsheet/Writer/Html.php index c9f2d7cb..eb50c456 100644 --- a/src/PhpSpreadsheet/Writer/Html.php +++ b/src/PhpSpreadsheet/Writer/Html.php @@ -131,6 +131,13 @@ class Html extends BaseWriter */ private $generateSheetNavigationBlock = true; + /** + * Callback for editing generated html. + * + * @var null|callable + */ + private $editHtmlCallback; + /** * Create a new HTML. */ @@ -190,6 +197,10 @@ class Html extends BaseWriter // Write footer $html .= $this->generateHTMLFooter(); + $callback = $this->editHtmlCallback; + if ($callback) { + $html = $callback($html); + } Calculation::setArrayReturnType($saveArrayReturnType); Calculation::getInstance($this->spreadsheet)->getDebugLog()->setWriteDebugLog($saveDebugLog); @@ -197,6 +208,17 @@ class Html extends BaseWriter return $html; } + /** + * Set a callback to edit the entire HTML. + * + * The callback must accept the HTML as string as first parameter, + * and it must return the edited HTML as string. + */ + public function setEditHtmlCallback(?callable $callback): void + { + $this->editHtmlCallback = $callback; + } + const VALIGN_ARR = [ Alignment::VERTICAL_BOTTOM => 'bottom', Alignment::VERTICAL_TOP => 'top', diff --git a/tests/PhpSpreadsheetTests/Writer/Html/CallbackTest.php b/tests/PhpSpreadsheetTests/Writer/Html/CallbackTest.php new file mode 100644 index 00000000..94c201a7 --- /dev/null +++ b/tests/PhpSpreadsheetTests/Writer/Html/CallbackTest.php @@ -0,0 +1,53 @@ + +body { + background-color: yellow; +} + + +EOF; + + return preg_replace('~~', "$newstyle", $html); + } + + public function testSetAndReset(): void + { + $spreadsheet = new Spreadsheet(); + $sheet = $spreadsheet->getActiveSheet(); + $sheet->setCellValue('A1', '1'); + + $writer = new Html($spreadsheet); + $html1 = $writer->generateHTMLall(); + $writer->setEditHtmlCallback([$this, 'yellowBody']); + $html2 = $writer->generateHTMLall(); + $writer->setEditHtmlCallback(null); + $html3 = $writer->generateHTMLall(); + + self::assertFalse(strpos($html1, 'background-color: yellow')); + self::assertNotFalse(strpos($html2, 'background-color: yellow')); + self::assertFalse(strpos($html3, 'background-color: yellow')); + self::assertEquals($html3, $html1); + + $writer->setEditHtmlCallback([$this, 'yellowBody']); + $oufil = tempnam(File::sysGetTempDir(), 'phpspreadsheet-test'); + $writer->save($oufil); + $html4 = file_get_contents($oufil); + unlink($oufil); + self::assertNotFalse(strpos($html4, 'background-color: yellow')); + + $this->writeAndReload($spreadsheet, 'Html'); + } +}