【问题标题】:Formula having the @ symbol added添加了@符号的公式
【发布时间】:2020-07-05 02:13:42
【问题描述】:

我一直在创建几个公式并将它们添加到 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 的公式中手动删除 @ 符号并按 Enter,则计算是正确的。

  • 关于为什么“Stdev mP”的前两个公式有效,但后六个失败的任何想法?


使用 PhpSpreadsheet 1.10.1

【问题讨论】:

    标签: php phpspreadsheet


    【解决方案1】:

    根据this,他们说

    隐式交集运算符是作为 大幅升级 Excel 的公式语言以支持动态 数组。动态数组带来了显着的新计算能力和 Excel 的功能。

    一般来说,返回多单元格区域或数组的函数 如果它们是在旧版本的 Excel。

    因此,如果您使用最近的 Excel 版本打开导出的文件,如果公式不是数组,它们会自动添加 @ 符号。而且我已经尝试了 OP 建议的解决方案,但似乎无法使用 PHPSpreadsheet 编写数组公式。

    我仍在寻找其他解决方案。

    【讨论】:

      【解决方案2】:

      通过这个 StackOverflow 链接了解如何为数组公式编写代码:

      https://stackoverflow.com/a/59930320/5359251

      $attrs = $sheet->getCell("C1")->getFormulaAttributes();
      $attrs['t'] = 'array';
      $sheet->getCell("C1")->setFormulaAttributes($attrs);
      

      我在 PhpSpreadsheet 文档中找不到任何内容。

      【讨论】:

        【解决方案3】:

        @ 用于数字/文本格式作为字符串,问题可能来自这部分。我会在设置值时调试公式,如果公式中是@remove

        var_dump($formula);
        str_replace("@", "", $formula);  
        $spreadsheet->getActiveSheet()->setCellValue('A2', $formula);
        

        【讨论】:

        • 没有成功。构建字符串 $cf_mP_Stdev 后,我将其分配给单元格。然后我执行了一个 getCell('P4')->getValue();公式定义正确,没有任何 '@' 符号 "=STDEV(IF(('Samples-Wells'!H3:H322>=J4)*('Samples-Wells'!H3:H322" & J4, '样品井'!H3:H322, "
        • 我还有其他没有嵌入“@”符号的 STDEV 公式“=STDEV('Controls-Wells'!I3:I18)”。有没有想过它是否与这个特定的 STDEV 公式有关,该公式基本上是用“*”做一个“与”?
        • 附加说明:我在 Microsoft Excel for Mac (V16.35) 上打开此文件。如果我在 Excels for Windows 上打开,则没有 @ 符号,如果我在每个单元格中按 Ctrl-Shirt-Enter,它就会被计算出来。没有考虑数组公式。需要弄清楚 Excel for Mac 中发生了什么
        猜你喜欢
        • 2020-07-23
        • 1970-01-01
        • 2020-01-03
        • 1970-01-01
        • 2017-04-22
        • 1970-01-01
        • 2014-02-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多