Allow Html Reader to write into existing spreadsheet

Sometimes you may want to read html into multiple worksheets within one
spreadsheet. Allowing the passing of a spreadsheet in makes this possible.
This commit is contained in:
Nathanael d. Noblet 2019-10-17 13:04:18 -06:00 committed by Adrien Crivelli
parent 788f79c1bb
commit 22bf54ca11
4 changed files with 71 additions and 5 deletions

View File

@ -42,6 +42,7 @@ and this project adheres to [Semantic Versioning](https://semver.org).
- Improve performance of IF function calls via ranch pruning to avoid resolution of every branches [#844](https://github.com/PHPOffice/PhpSpreadsheet/pull/844)
- MATCH function supports `*?~` Excel functionality, when match_type=0 [#1116](https://github.com/PHPOffice/PhpSpreadsheet/issues/1116)
- Allow HTML Reader to accept HTML as a string [#1136](https://github.com/PHPOffice/PhpSpreadsheet/pull/1136)
- Allow HTML Reader to accept HTML as a string into an existing spreadsheet [#1212](https://github.com/PHPOffice/PhpSpreadsheet/pull/1212)
### Fixed

View File

@ -902,3 +902,27 @@ $spreadsheet = $reader->loadFromString($htmlString);
$writer = \PhpOffice\PhpSpreadsheet\IOFactory::createWriter($spreadsheet, 'Xls');
$writer->save('write.xls');
```
Suppose you have multiple worksheets you'd like created from html. This can be
accomplished as follows.
```php
$firstHtmlString = '<table>
<tr>
<td>Hello World</td>
</tr>
</table>';
$secondHtmlString = '<table>
<tr>
<td>Hello World</td>
</tr>
</table>';
$reader = new \PhpOffice\PhpSpreadsheet\Reader\Html();
$spreadsheet = $reader->loadFromString($firstHtmlString);
$reader->setSheetIndex(1);
$spreadhseet = $reader->loadFromString($secondHtmlString, $spreadsheet);
$writer = \PhpOffice\PhpSpreadsheet\IOFactory::createWriter($spreadsheet, 'Xls');
$writer->save('write.xls');
```

View File

@ -606,13 +606,12 @@ class Html extends BaseReader
/**
* Spreadsheet from content.
*
* @param string $content
*
* @throws Exception
* @param string $content
* @param Spreadsheet|null $spreadsheet
*
* @return Spreadsheet
*/
public function loadFromString($content): Spreadsheet
public function loadFromString($content, ?Spreadsheet $spreadsheet = null): Spreadsheet
{
// Create a new DOM object
$dom = new DOMDocument();
@ -622,7 +621,7 @@ class Html extends BaseReader
throw new Exception('Failed to load content as a DOM Document');
}
return $this->loadDocument($dom, new Spreadsheet());
return $this->loadDocument($dom, $spreadsheet ?? new Spreadsheet());
}
/**

View File

@ -329,6 +329,48 @@ class HtmlTest extends TestCase
$this->assertContains("\n", $cellValue);
}
public function testCanLoadFromStringIntoExistingSpreadsheet()
{
$html = '<table>
<tr>
<td>Hello World</td>
</tr>
<tr>
<td>Hello<br />World</td>
</tr>
<tr>
<td>Hello<br>World</td>
</tr>
</table>';
$reader = new Html();
$spreadsheet = $reader->loadFromString($html);
$firstSheet = $spreadsheet->getSheet(0);
$cellStyle = $firstSheet->getStyle('A1');
self::assertFalse($cellStyle->getAlignment()->getWrapText());
$cellStyle = $firstSheet->getStyle('A2');
self::assertTrue($cellStyle->getAlignment()->getWrapText());
$cellValue = $firstSheet->getCell('A2')->getValue();
$this->assertContains("\n", $cellValue);
$cellStyle = $firstSheet->getStyle('A3');
self::assertTrue($cellStyle->getAlignment()->getWrapText());
$cellValue = $firstSheet->getCell('A3')->getValue();
$this->assertContains("\n", $cellValue);
$reader->setSheetIndex(1);
$html = '<table>
<tr>
<td>Goodbye World</td>
</tr>
</table>';
self::assertEquals(1, $spreadsheet->getSheetCount());
$spreadsheet = $reader->loadFromString($html, $spreadsheet);
self::assertEquals(2, $spreadsheet->getSheetCount());
}
/**
* @param string $html
*