添加了@符号的公式
Formula having the @ symbol added
我一直在创建几个公式并将它们添加到 PhpSpreadsheet 中,没有任何问题。但是当我创建以下公式,添加到 PhpSpreadsheet 并打开 xlsx 文件时,8 行中的 6 行有'#VALUE!'
该公式正在计算大于或等于最小值且小于或等于最大值的单元格区域的 STDEV。
公式是这样创建的:
$cf_mP_Stdev =
"=STDEV(IF(('" . $samplesWellsSheetName . "'!" . $mpCol . ($writeSampleWellsRow - 319) . ":" . $mpCol . $writeSampleWellsRow . ">=J" . $writeControlPlatesRow . ")*('" .
$samplesWellsSheetName . "'!" . $mpCol . ($writeSampleWellsRow - 319) . ":" . $mpCol . $writeSampleWellsRow . "<=L" . $writeControlPlatesRow . "),'" .
$samplesWellsSheetName . "'!" . $mpCol . ($writeSampleWellsRow - 319) . ":" . $mpCol . $writeSampleWellsRow . "))";
在 Excel 我期待:
=STDEV(IF(('Samples-Wells'!H3:H322>=J4)*('Samples-Wells'!H3:H322<=L4),'Samples-Wells'!H3:H322))
但是当我打开我的 xlsx 文件时,它在三个范围中的两个前面有“@”符号:
=STDEV(IF((@'Samples-Wells'!H3:H322>=J4)*(@'Samples-Wells'!H3:H322<=L4),'Samples-Wells'!H3:H322))
对于这个公式和下一个公式,计算值是正确的。但是对于接下来的 6 个公式,我收到了“#VALUE!”。这是第三个公式。没有区别,只是它针对下一组单元格。 Samples-Wells 工作表中的 H 列包含第 3 行到 1282 行的数据。
=STDEV(IF((@'Samples-Wells'!H323:H642 >= J6)*(@'Samples-Wells'!H323:H642 <= L6),'Samples-Wells'!H323:H642))
所以我的问题是:
为什么要在公式中添加@符号?这是来自 PhpSpreadsheet 还是 Excel?
旁注: 如果我手动从 Excel 中的公式中删除 @ 符号并按回车键,则计算是正确的。
想知道为什么 "Stdev mP" 的前两个公式有效,但后六个公式失败了吗?
使用 PhpSpreadsheet 1.10.1
@ 用于 number/text 格式化为字符串可能问题出在这部分。我会在设置值时调试公式,如果公式中是 @remove
var_dump($formula);
str_replace("@", "", $formula);
$spreadsheet->getActiveSheet()->setCellValue('A2', $formula);
通过这个 Whosebug 找到了如何为数组公式编码 link:
$attrs = $sheet->getCell("C1")->getFormulaAttributes();
$attrs['t'] = 'array';
$sheet->getCell("C1")->setFormulaAttributes($attrs);
我在 PhpSpreadsheet 文档中找不到任何内容。
根据this,他们说
The implicit intersection operator was introduced as part of
substantial upgrade to Excel's formula language to support dynamic
arrays. Dynamic arrays bring significant new calculation ability and
functionality to Excel.
和
Generally speaking, functions that return multi-cell ranges or arrays
will be prefixed with @ if they were authored in an older version of
Excel.
因此,如果您使用最近的 Excel 版本打开导出的文件,如果公式不是数组,它们将自动添加 @ 符号。我已经尝试了 OP 建议的解决方案,但似乎无法使用 PHPSpreadsheet 编写数组公式。
我还在寻找其他解决方案。
我一直在创建几个公式并将它们添加到 PhpSpreadsheet 中,没有任何问题。但是当我创建以下公式,添加到 PhpSpreadsheet 并打开 xlsx 文件时,8 行中的 6 行有'#VALUE!'
该公式正在计算大于或等于最小值且小于或等于最大值的单元格区域的 STDEV。
公式是这样创建的:
$cf_mP_Stdev =
"=STDEV(IF(('" . $samplesWellsSheetName . "'!" . $mpCol . ($writeSampleWellsRow - 319) . ":" . $mpCol . $writeSampleWellsRow . ">=J" . $writeControlPlatesRow . ")*('" .
$samplesWellsSheetName . "'!" . $mpCol . ($writeSampleWellsRow - 319) . ":" . $mpCol . $writeSampleWellsRow . "<=L" . $writeControlPlatesRow . "),'" .
$samplesWellsSheetName . "'!" . $mpCol . ($writeSampleWellsRow - 319) . ":" . $mpCol . $writeSampleWellsRow . "))";
在 Excel 我期待:
=STDEV(IF(('Samples-Wells'!H3:H322>=J4)*('Samples-Wells'!H3:H322<=L4),'Samples-Wells'!H3:H322))
但是当我打开我的 xlsx 文件时,它在三个范围中的两个前面有“@”符号:
=STDEV(IF((@'Samples-Wells'!H3:H322>=J4)*(@'Samples-Wells'!H3:H322<=L4),'Samples-Wells'!H3:H322))
对于这个公式和下一个公式,计算值是正确的。但是对于接下来的 6 个公式,我收到了“#VALUE!”。这是第三个公式。没有区别,只是它针对下一组单元格。 Samples-Wells 工作表中的 H 列包含第 3 行到 1282 行的数据。
=STDEV(IF((@'Samples-Wells'!H323:H642 >= J6)*(@'Samples-Wells'!H323:H642 <= L6),'Samples-Wells'!H323:H642))
所以我的问题是:
为什么要在公式中添加@符号?这是来自 PhpSpreadsheet 还是 Excel?
旁注: 如果我手动从 Excel 中的公式中删除 @ 符号并按回车键,则计算是正确的。
想知道为什么 "Stdev mP" 的前两个公式有效,但后六个公式失败了吗?
使用 PhpSpreadsheet 1.10.1
@ 用于 number/text 格式化为字符串可能问题出在这部分。我会在设置值时调试公式,如果公式中是 @remove
var_dump($formula);
str_replace("@", "", $formula);
$spreadsheet->getActiveSheet()->setCellValue('A2', $formula);
通过这个 Whosebug 找到了如何为数组公式编码 link:
$attrs = $sheet->getCell("C1")->getFormulaAttributes();
$attrs['t'] = 'array';
$sheet->getCell("C1")->setFormulaAttributes($attrs);
我在 PhpSpreadsheet 文档中找不到任何内容。
根据this,他们说
The implicit intersection operator was introduced as part of substantial upgrade to Excel's formula language to support dynamic arrays. Dynamic arrays bring significant new calculation ability and functionality to Excel.
和
Generally speaking, functions that return multi-cell ranges or arrays will be prefixed with @ if they were authored in an older version of Excel.
因此,如果您使用最近的 Excel 版本打开导出的文件,如果公式不是数组,它们将自动添加 @ 符号。我已经尝试了 OP 建议的解决方案,但似乎无法使用 PHPSpreadsheet 编写数组公式。
我还在寻找其他解决方案。