Merge pull request #1499 from oleibman/htmledit
Add ability to save edited Html/Pdf
This commit is contained in:
commit
a90bf863ab
|
@ -707,7 +707,7 @@ $sty = $writer->generateStyles(false); // do not write <style> and </style>
|
|||
$newstyle = <<<EOF
|
||||
<style type='text/css'>
|
||||
$sty
|
||||
html {
|
||||
body {
|
||||
background-color: yellow;
|
||||
}
|
||||
</style>
|
||||
|
@ -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
|
||||
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
|
||||
|
|
|
@ -0,0 +1,20 @@
|
|||
<?php
|
||||
|
||||
use PhpOffice\PhpSpreadsheet\Writer\Html;
|
||||
|
||||
require __DIR__ . '/../Header.php';
|
||||
$spreadsheet = require __DIR__ . '/../templates/sampleSpreadsheet.php';
|
||||
|
||||
$filename = $helper->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);
|
|
@ -0,0 +1,25 @@
|
|||
<?php
|
||||
|
||||
use PhpOffice\PhpSpreadsheet\Worksheet\PageSetup;
|
||||
use PhpOffice\PhpSpreadsheet\Writer\Pdf\Mpdf;
|
||||
|
||||
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);
|
||||
$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);
|
|
@ -0,0 +1,51 @@
|
|||
<?php
|
||||
|
||||
use PhpOffice\PhpSpreadsheet\Worksheet\PageSetup;
|
||||
use PhpOffice\PhpSpreadsheet\Writer\Pdf\Dompdf;
|
||||
use PhpOffice\PhpSpreadsheet\Writer\Pdf\Mpdf;
|
||||
use PhpOffice\PhpSpreadsheet\Writer\Pdf\Tcpdf;
|
||||
|
||||
function replaceBody(string $html): string
|
||||
{
|
||||
$lorem = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.';
|
||||
$bodystring = '~<body>.*</body>~ms';
|
||||
$bodyrepl = <<<EOF
|
||||
<body>
|
||||
<h1>Serif</h1>
|
||||
<p style='font-family: serif; font-size: 12pt;'>$lorem</p>
|
||||
<h1>Sans-Serif</h1>
|
||||
<p style='font-family: sans-serif; font-size: 12pt;'>$lorem</p>
|
||||
<h1>Monospace</h1>
|
||||
<p style='font-family: monospace; font-size: 12pt;'>$lorem</p>
|
||||
</body>
|
||||
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);
|
|
@ -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',
|
||||
|
|
|
@ -0,0 +1,53 @@
|
|||
<?php
|
||||
|
||||
namespace PhpOffice\PhpSpreadsheetTests\Writer\Html;
|
||||
|
||||
use PhpOffice\PhpSpreadsheet\Shared\File;
|
||||
use PhpOffice\PhpSpreadsheet\Spreadsheet;
|
||||
use PhpOffice\PhpSpreadsheet\Writer\Html;
|
||||
use PhpOffice\PhpSpreadsheetTests\Functional;
|
||||
|
||||
class CallbackTest extends Functional\AbstractFunctional
|
||||
{
|
||||
public function yellowBody(string $html): string
|
||||
{
|
||||
$newstyle = <<<EOF
|
||||
<style type='text/css'>
|
||||
body {
|
||||
background-color: yellow;
|
||||
}
|
||||
</style>
|
||||
|
||||
EOF;
|
||||
|
||||
return preg_replace('~</head>~', "$newstyle</head>", $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');
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue