Skip to content

Commit d8b4c3b

Browse files
authored
Fix for #1533 (#1534)
Code assumes that formula whose result starts with # indicates error. Change to check entire result against error list in Functions.
1 parent 35c0496 commit d8b4c3b

File tree

2 files changed

+63
-1
lines changed

2 files changed

+63
-1
lines changed

src/PhpSpreadsheet/Writer/Xlsx/Worksheet.php

+1-1
Original file line numberDiff line numberDiff line change
@@ -1112,7 +1112,7 @@ private function writeCellFormula(XMLWriter $objWriter, string $cellValue, Cell
11121112
{
11131113
$calculatedValue = $this->getParentWriter()->getPreCalculateFormulas() ? $pCell->getCalculatedValue() : $cellValue;
11141114
if (is_string($calculatedValue)) {
1115-
if (substr($calculatedValue, 0, 1) === '#') {
1115+
if (\PhpOffice\PhpSpreadsheet\Calculation\Functions::isError($calculatedValue)) {
11161116
$this->writeCellError($objWriter, 'e', $cellValue, $calculatedValue);
11171117

11181118
return;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
<?php
2+
3+
namespace PhpOffice\PhpSpreadsheetTests\Writer\Xlsx;
4+
5+
use PhpOffice\PhpSpreadsheet\Cell\DataType;
6+
use PhpOffice\PhpSpreadsheet\Reader\Xlsx as Reader;
7+
use PhpOffice\PhpSpreadsheet\Settings;
8+
use PhpOffice\PhpSpreadsheet\Shared\File;
9+
use PhpOffice\PhpSpreadsheet\Spreadsheet;
10+
use PhpOffice\PhpSpreadsheet\Writer\Xlsx as Writer;
11+
use PHPUnit\Framework\TestCase;
12+
use ZipArchive;
13+
14+
class StartsWithHashTest extends TestCase
15+
{
16+
public function testStartWithHash(): void
17+
{
18+
$outputFilename = tempnam(File::sysGetTempDir(), 'phpspreadsheet-test');
19+
Settings::setLibXmlLoaderOptions(null);
20+
$spreadsheet = new Spreadsheet();
21+
$sheet = $spreadsheet->getActiveSheet();
22+
$sheet->setCellValueExplicit('A1', '#define M', DataType::TYPE_STRING);
23+
$sheet->setCellValue('A2', '=A1');
24+
$sheet->setCellValue('A3', '=UNKNOWNFUNC()');
25+
26+
$writer = new Writer($spreadsheet);
27+
$writer->save($outputFilename);
28+
29+
$reader = new Reader();
30+
$sheet = $reader->load($outputFilename);
31+
unlink($outputFilename);
32+
33+
self::assertSame('#define M', $sheet->getActiveSheet()->getCell('A1')->getValue());
34+
self::assertSame('#define M', $sheet->getActiveSheet()->getCell('A2')->getCalculatedValue());
35+
self::assertSame('f', $sheet->getActiveSheet()->getCell('A3')->getDataType());
36+
self::assertSame('#NAME?', $sheet->getActiveSheet()->getCell('A3')->getCalculatedValue());
37+
self::assertSame('f', $sheet->getActiveSheet()->getCell('A3')->getDataType());
38+
}
39+
40+
public function testStartWithHashReadRaw(): void
41+
{
42+
// Make sure raw data indicates A3 is an error, but A2 isn't.
43+
$outputFilename = tempnam(File::sysGetTempDir(), 'phpspreadsheet-test');
44+
Settings::setLibXmlLoaderOptions(null);
45+
$spreadsheet = new Spreadsheet();
46+
$sheet = $spreadsheet->getActiveSheet();
47+
$sheet->setCellValueExplicit('A1', '#define M', DataType::TYPE_STRING);
48+
$sheet->setCellValue('A2', '=A1');
49+
$sheet->setCellValue('A3', '=UNKNOWNFUNC()');
50+
51+
$writer = new Writer($spreadsheet);
52+
$writer->save($outputFilename);
53+
$zip = new ZipArchive();
54+
$zip->open($outputFilename);
55+
$resultSheet1Raw = $zip->getFromName('xl/worksheets/sheet1.xml');
56+
$zip->close();
57+
unlink($outputFilename);
58+
59+
self::assertStringContainsString('<c r="A3" t="e">', $resultSheet1Raw);
60+
self::assertStringContainsString('<c r="A2" t="str">', $resultSheet1Raw);
61+
}
62+
}

0 commit comments

Comments
 (0)