diff --git a/src/Spout/Common/Entity/Cell.php b/src/Spout/Common/Entity/Cell.php index bd7a730..c1de389 100644 --- a/src/Spout/Common/Entity/Cell.php +++ b/src/Spout/Common/Entity/Cell.php @@ -91,6 +91,14 @@ class Cell return !$this->isError() ? $this->value : null; } + /** + * @return mixed + */ + public function getValueEvenIfError() + { + return $this->value; + } + /** * @param Style|null $style */ diff --git a/src/Spout/Writer/ODS/Manager/WorksheetManager.php b/src/Spout/Writer/ODS/Manager/WorksheetManager.php index 6392259..4dfe9c8 100644 --- a/src/Spout/Writer/ODS/Manager/WorksheetManager.php +++ b/src/Spout/Writer/ODS/Manager/WorksheetManager.php @@ -204,6 +204,11 @@ class WorksheetManager implements WorksheetManagerInterface $data .= ' office:value-type="float" calcext:value-type="float" office:value="' . $cell->getValue() . '">'; $data .= '' . $cell->getValue() . ''; $data .= ''; + } elseif ($cell->isError() && is_string($cell->getValueEvenIfError())) { + // only writes the error value if it's a string + $data .= ' office:value-type="string" calcext:value-type="error" office:value="">'; + $data .= '' . $cell->getValueEvenIfError() . ''; + $data .= ''; } elseif ($cell->isEmpty()) { $data .= '/>'; } else { diff --git a/src/Spout/Writer/XLSX/Manager/WorksheetManager.php b/src/Spout/Writer/XLSX/Manager/WorksheetManager.php index d4e65e2..741d0aa 100644 --- a/src/Spout/Writer/XLSX/Manager/WorksheetManager.php +++ b/src/Spout/Writer/XLSX/Manager/WorksheetManager.php @@ -218,6 +218,9 @@ EOD; $cellXML .= ' t="b">' . (int) ($cell->getValue()) . ''; } elseif ($cell->isNumeric()) { $cellXML .= '>' . $cell->getValue() . ''; + } elseif ($cell->isError() && is_string($cell->getValueEvenIfError())) { + // only writes the error value if it's a string + $cellXML .= ' t="e">' . $cell->getValueEvenIfError() . ''; } elseif ($cell->isEmpty()) { if ($this->styleManager->shouldApplyStyleOnEmptyCell($styleId)) { $cellXML .= '/>'; diff --git a/tests/Spout/Writer/ODS/WriterTest.php b/tests/Spout/Writer/ODS/WriterTest.php index 05c4930..b30a8f6 100644 --- a/tests/Spout/Writer/ODS/WriterTest.php +++ b/tests/Spout/Writer/ODS/WriterTest.php @@ -2,6 +2,7 @@ namespace Box\Spout\Writer\ODS; +use Box\Spout\Common\Entity\Cell; use Box\Spout\Common\Entity\Row; use Box\Spout\Common\Exception\InvalidArgumentException; use Box\Spout\Common\Exception\IOException; @@ -321,6 +322,24 @@ class WriterTest extends TestCase } } + /** + * @return void + */ + public function testAddRowShouldSupportCellInError() + { + $fileName = 'test_add_row_should_support_cell_in_error.ods'; + + $cell = WriterEntityFactory::createCell('#DIV/0'); + $cell->setType(Cell::TYPE_ERROR); + + $row = WriterEntityFactory::createRow([$cell]); + + $this->writeToODSFile([$row], $fileName); + + $this->assertValueWasWritten($fileName, 'calcext:value-type="error"'); + $this->assertValueWasWritten($fileName, '#DIV/0'); + } + /** * @return void */ diff --git a/tests/Spout/Writer/XLSX/WriterTest.php b/tests/Spout/Writer/XLSX/WriterTest.php index d8a4768..15cc4e4 100644 --- a/tests/Spout/Writer/XLSX/WriterTest.php +++ b/tests/Spout/Writer/XLSX/WriterTest.php @@ -2,6 +2,7 @@ namespace Box\Spout\Writer\XLSX; +use Box\Spout\Common\Entity\Cell; use Box\Spout\Common\Entity\Row; use Box\Spout\Common\Exception\InvalidArgumentException; use Box\Spout\Common\Exception\IOException; @@ -375,6 +376,23 @@ class WriterTest extends TestCase $this->assertInlineDataWasWrittenToSheet($fileName, 1, 10.2); } + /** + * @return void + */ + public function testAddRowShouldSupportCellInError() + { + $fileName = 'test_add_row_should_support_cell_in_error.xlsx'; + + $cell = WriterEntityFactory::createCell('#DIV/0'); + $cell->setType(Cell::TYPE_ERROR); + + $row = WriterEntityFactory::createRow([$cell]); + + $this->writeToXLSXFile([$row], $fileName); + + $this->assertInlineDataWasWrittenToSheet($fileName, 1, 't="e">#DIV/0'); + } + /** * @return void */