Add support for cells in error when writing XLSX and ODS
When appending data to an existing sheet, it was possible to get cells in error when reading (DIV/0 for instance). When trying to write them back, `addRow` would throw because `Cell`s in error were not supported by the writers.
This commit is contained in:
parent
eb88bb4c3a
commit
7964dadc21
@ -91,6 +91,14 @@ class Cell
|
||||
return !$this->isError() ? $this->value : null;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return mixed
|
||||
*/
|
||||
public function getValueEvenIfError()
|
||||
{
|
||||
return $this->value;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param Style|null $style
|
||||
*/
|
||||
|
@ -204,6 +204,11 @@ class WorksheetManager implements WorksheetManagerInterface
|
||||
$data .= ' office:value-type="float" calcext:value-type="float" office:value="' . $cell->getValue() . '">';
|
||||
$data .= '<text:p>' . $cell->getValue() . '</text:p>';
|
||||
$data .= '</table:table-cell>';
|
||||
} 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 .= '<text:p>' . $cell->getValueEvenIfError() . '</text:p>';
|
||||
$data .= '</table:table-cell>';
|
||||
} elseif ($cell->isEmpty()) {
|
||||
$data .= '/>';
|
||||
} else {
|
||||
|
@ -218,6 +218,9 @@ EOD;
|
||||
$cellXML .= ' t="b"><v>' . (int) ($cell->getValue()) . '</v></c>';
|
||||
} elseif ($cell->isNumeric()) {
|
||||
$cellXML .= '><v>' . $cell->getValue() . '</v></c>';
|
||||
} elseif ($cell->isError() && is_string($cell->getValueEvenIfError())) {
|
||||
// only writes the error value if it's a string
|
||||
$cellXML .= ' t="e"><v>' . $cell->getValueEvenIfError() . '</v></c>';
|
||||
} elseif ($cell->isEmpty()) {
|
||||
if ($this->styleManager->shouldApplyStyleOnEmptyCell($styleId)) {
|
||||
$cellXML .= '/>';
|
||||
|
@ -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, '<text:p>#DIV/0</text:p>');
|
||||
}
|
||||
|
||||
/**
|
||||
* @return void
|
||||
*/
|
||||
|
@ -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"><v>#DIV/0</v>');
|
||||
}
|
||||
|
||||
/**
|
||||
* @return void
|
||||
*/
|
||||
|
Loading…
x
Reference in New Issue
Block a user