Формула с добавленным символом @ - PullRequest
1 голос
/ 24 марта 2020

Я создал несколько формул и добавил их в таблицу PhpSpreadsheet без каких-либо проблем. Но когда я создал следующую формулу, добавил в PhpSpreadsheet и открыл файл xlsx 6 из 8 строк имели «#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 формул я получил «# ЗНАЧЕНИЕ!». Вот третья формула. Нет разницы, кроме того, что это против следующего набора ячеек. Столбец H на листе Samples-Wells содержит данные от строки 3 до 1282.

=STDEV(IF((@'Samples-Wells'!H323:H642 >= J6)*(@'Samples-Wells'!H323:H642 <= L6),'Samples-Wells'!H323:H642))

enter image description here

Итак, мои вопросы:

  • Почему символы @ добавляются в формулу? Это происходит из PhpSpreadsheet или Excel?

    Примечание: Если я вручную удаляю символы @ из формулы в Excel и нажимаю ввод, вычисление правильное.

  • Есть мысли о том, почему первые две формулы для «Stdev mP» работали, но последние шесть не сработали?


Использование PhpSpreadsheet 1.10.1

Ответы [ 3 ]

0 голосов
/ 26 марта 2020

Обнаружено, как кодировать формулы массива по этой ссылке StackOverflow:

{ ссылка }

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

Я не смог найти ничего в документах PhpSpreadsheet.

0 голосов
/ 30 апреля 2020

Согласно this , они говорят

Оператор неявного пересечения был введен как часть существенного обновления языка формул Excel для поддержки динамических массивов. Динамические c массивы предоставляют значительную новую вычислительную способность и функциональность в Excel.

и

Вообще говоря, функции, которые возвращают многосотовые диапазоны или массивы, будут иметь префикс с @ если они были созданы в более старой версии Excel.

Поэтому, если вы откроете экспортированный файл с последними версиями Excel, они автоматически добавят символ @, если формула не является массивом. И я попробовал предложенное OP решение, но кажется, что невозможно написать формулы массива, используя PHPSpreadsheet.

Я все еще ищу другие решения.

0 голосов
/ 25 марта 2020

@ используется для форматирования чисел / текста, так как строка может быть, проблема в этой части. Я бы отлаживал в формуле при установке значения и если в формуле есть @ удалить

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