Code assumes that formula whose result starts with # indicates error. Change to check entire result against error list in Functions.
This commit is contained in:
parent
35c04964cf
commit
d8b4c3b26e
|
@ -1112,7 +1112,7 @@ class Worksheet extends WriterPart
|
||||||
{
|
{
|
||||||
$calculatedValue = $this->getParentWriter()->getPreCalculateFormulas() ? $pCell->getCalculatedValue() : $cellValue;
|
$calculatedValue = $this->getParentWriter()->getPreCalculateFormulas() ? $pCell->getCalculatedValue() : $cellValue;
|
||||||
if (is_string($calculatedValue)) {
|
if (is_string($calculatedValue)) {
|
||||||
if (substr($calculatedValue, 0, 1) === '#') {
|
if (\PhpOffice\PhpSpreadsheet\Calculation\Functions::isError($calculatedValue)) {
|
||||||
$this->writeCellError($objWriter, 'e', $cellValue, $calculatedValue);
|
$this->writeCellError($objWriter, 'e', $cellValue, $calculatedValue);
|
||||||
|
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -0,0 +1,62 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace PhpOffice\PhpSpreadsheetTests\Writer\Xlsx;
|
||||||
|
|
||||||
|
use PhpOffice\PhpSpreadsheet\Cell\DataType;
|
||||||
|
use PhpOffice\PhpSpreadsheet\Reader\Xlsx as Reader;
|
||||||
|
use PhpOffice\PhpSpreadsheet\Settings;
|
||||||
|
use PhpOffice\PhpSpreadsheet\Shared\File;
|
||||||
|
use PhpOffice\PhpSpreadsheet\Spreadsheet;
|
||||||
|
use PhpOffice\PhpSpreadsheet\Writer\Xlsx as Writer;
|
||||||
|
use PHPUnit\Framework\TestCase;
|
||||||
|
use ZipArchive;
|
||||||
|
|
||||||
|
class StartsWithHashTest extends TestCase
|
||||||
|
{
|
||||||
|
public function testStartWithHash(): void
|
||||||
|
{
|
||||||
|
$outputFilename = tempnam(File::sysGetTempDir(), 'phpspreadsheet-test');
|
||||||
|
Settings::setLibXmlLoaderOptions(null);
|
||||||
|
$spreadsheet = new Spreadsheet();
|
||||||
|
$sheet = $spreadsheet->getActiveSheet();
|
||||||
|
$sheet->setCellValueExplicit('A1', '#define M', DataType::TYPE_STRING);
|
||||||
|
$sheet->setCellValue('A2', '=A1');
|
||||||
|
$sheet->setCellValue('A3', '=UNKNOWNFUNC()');
|
||||||
|
|
||||||
|
$writer = new Writer($spreadsheet);
|
||||||
|
$writer->save($outputFilename);
|
||||||
|
|
||||||
|
$reader = new Reader();
|
||||||
|
$sheet = $reader->load($outputFilename);
|
||||||
|
unlink($outputFilename);
|
||||||
|
|
||||||
|
self::assertSame('#define M', $sheet->getActiveSheet()->getCell('A1')->getValue());
|
||||||
|
self::assertSame('#define M', $sheet->getActiveSheet()->getCell('A2')->getCalculatedValue());
|
||||||
|
self::assertSame('f', $sheet->getActiveSheet()->getCell('A3')->getDataType());
|
||||||
|
self::assertSame('#NAME?', $sheet->getActiveSheet()->getCell('A3')->getCalculatedValue());
|
||||||
|
self::assertSame('f', $sheet->getActiveSheet()->getCell('A3')->getDataType());
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testStartWithHashReadRaw(): void
|
||||||
|
{
|
||||||
|
// Make sure raw data indicates A3 is an error, but A2 isn't.
|
||||||
|
$outputFilename = tempnam(File::sysGetTempDir(), 'phpspreadsheet-test');
|
||||||
|
Settings::setLibXmlLoaderOptions(null);
|
||||||
|
$spreadsheet = new Spreadsheet();
|
||||||
|
$sheet = $spreadsheet->getActiveSheet();
|
||||||
|
$sheet->setCellValueExplicit('A1', '#define M', DataType::TYPE_STRING);
|
||||||
|
$sheet->setCellValue('A2', '=A1');
|
||||||
|
$sheet->setCellValue('A3', '=UNKNOWNFUNC()');
|
||||||
|
|
||||||
|
$writer = new Writer($spreadsheet);
|
||||||
|
$writer->save($outputFilename);
|
||||||
|
$zip = new ZipArchive();
|
||||||
|
$zip->open($outputFilename);
|
||||||
|
$resultSheet1Raw = $zip->getFromName('xl/worksheets/sheet1.xml');
|
||||||
|
$zip->close();
|
||||||
|
unlink($outputFilename);
|
||||||
|
|
||||||
|
self::assertStringContainsString('<c r="A3" t="e">', $resultSheet1Raw);
|
||||||
|
self::assertStringContainsString('<c r="A2" t="str">', $resultSheet1Raw);
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue