Skip to content

Commit 22bf54c

Browse files
gnat42PowerKiKi
authored andcommitted
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.
1 parent 788f79c commit 22bf54c

File tree

4 files changed

+71
-5
lines changed

4 files changed

+71
-5
lines changed

CHANGELOG.md

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

4647
### Fixed
4748

docs/topics/reading-and-writing-to-file.md

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -902,3 +902,27 @@ $spreadsheet = $reader->loadFromString($htmlString);
902902
$writer = \PhpOffice\PhpSpreadsheet\IOFactory::createWriter($spreadsheet, 'Xls');
903903
$writer->save('write.xls');
904904
```
905+
906+
Suppose you have multiple worksheets you'd like created from html. This can be
907+
accomplished as follows.
908+
909+
```php
910+
$firstHtmlString = '<table>
911+
<tr>
912+
<td>Hello World</td>
913+
</tr>
914+
</table>';
915+
$secondHtmlString = '<table>
916+
<tr>
917+
<td>Hello World</td>
918+
</tr>
919+
</table>';
920+
921+
$reader = new \PhpOffice\PhpSpreadsheet\Reader\Html();
922+
$spreadsheet = $reader->loadFromString($firstHtmlString);
923+
$reader->setSheetIndex(1);
924+
$spreadhseet = $reader->loadFromString($secondHtmlString, $spreadsheet);
925+
926+
$writer = \PhpOffice\PhpSpreadsheet\IOFactory::createWriter($spreadsheet, 'Xls');
927+
$writer->save('write.xls');
928+
```

src/PhpSpreadsheet/Reader/Html.php

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -606,13 +606,12 @@ public function loadIntoExisting($pFilename, Spreadsheet $spreadsheet)
606606
/**
607607
* Spreadsheet from content.
608608
*
609-
* @param string $content
610-
*
611-
* @throws Exception
609+
* @param string $content
610+
* @param Spreadsheet|null $spreadsheet
612611
*
613612
* @return Spreadsheet
614613
*/
615-
public function loadFromString($content): Spreadsheet
614+
public function loadFromString($content, ?Spreadsheet $spreadsheet = null): Spreadsheet
616615
{
617616
// Create a new DOM object
618617
$dom = new DOMDocument();
@@ -622,7 +621,7 @@ public function loadFromString($content): Spreadsheet
622621
throw new Exception('Failed to load content as a DOM Document');
623622
}
624623

625-
return $this->loadDocument($dom, new Spreadsheet());
624+
return $this->loadDocument($dom, $spreadsheet ?? new Spreadsheet());
626625
}
627626

628627
/**

tests/PhpSpreadsheetTests/Reader/HtmlTest.php

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -329,6 +329,48 @@ public function testCanLoadFromString()
329329
$this->assertContains("\n", $cellValue);
330330
}
331331

332+
public function testCanLoadFromStringIntoExistingSpreadsheet()
333+
{
334+
$html = '<table>
335+
<tr>
336+
<td>Hello World</td>
337+
</tr>
338+
<tr>
339+
<td>Hello<br />World</td>
340+
</tr>
341+
<tr>
342+
<td>Hello<br>World</td>
343+
</tr>
344+
</table>';
345+
$reader = new Html();
346+
$spreadsheet = $reader->loadFromString($html);
347+
$firstSheet = $spreadsheet->getSheet(0);
348+
349+
$cellStyle = $firstSheet->getStyle('A1');
350+
self::assertFalse($cellStyle->getAlignment()->getWrapText());
351+
352+
$cellStyle = $firstSheet->getStyle('A2');
353+
self::assertTrue($cellStyle->getAlignment()->getWrapText());
354+
$cellValue = $firstSheet->getCell('A2')->getValue();
355+
$this->assertContains("\n", $cellValue);
356+
357+
$cellStyle = $firstSheet->getStyle('A3');
358+
self::assertTrue($cellStyle->getAlignment()->getWrapText());
359+
$cellValue = $firstSheet->getCell('A3')->getValue();
360+
$this->assertContains("\n", $cellValue);
361+
362+
$reader->setSheetIndex(1);
363+
$html = '<table>
364+
<tr>
365+
<td>Goodbye World</td>
366+
</tr>
367+
</table>';
368+
369+
self::assertEquals(1, $spreadsheet->getSheetCount());
370+
$spreadsheet = $reader->loadFromString($html, $spreadsheet);
371+
self::assertEquals(2, $spreadsheet->getSheetCount());
372+
}
373+
332374
/**
333375
* @param string $html
334376
*

0 commit comments

Comments
 (0)