Как запретить Excel случайным образом добавлять символ @ в мои формулы

Контекст

Я использую xlsxwriter для записи некоторых данных в файл xlsx. из кода python.
Мне нужно чтобы заполнить ячейку формулой, вычисляющей среднее значение определенного столбца (содержащего значения времени).

Описание проблемы

Я заметил, что когда я пытаюсь открыть свой документ с помощью Excel, он автоматически добавляет символ «@» прямо перед моим диапазоном, что приводит к сбою вычисления моей формулы...
Если я вручную удалю этот лишний «@», формула работает отлично, как и ожидалось.

Это действительно раздражает, когда приходится вручную исправлять мою формулу, так как у меня есть много похожих вычислений средних значений, которые не работают из-за этого. предотвратить это нежелательное поведение программно из моего кода Python с помощью API xlsxwriter.

Вопрос

Кто-нибудь знает, есть ли способ запретить Excel выполнять какие-либо изменения моих формул?

Что я уже пробовал

Я уже пытался защитить все свои листы (сделать их только для чтения), но, похоже, это применимо только для пользователя, а не для Excel...


Пример

Вот пример моей проблемы (чтобы было понятнее, что это загрузка простого текста).

Из моего кода Python, если я напишу следующую формулу:

=AVERAGE(TIMEVALUE(B2:B8))

После открытия документа Excel автоматически изменяет формулу следующим образом:

=AVERAGE(TIMEVALUE(@B2:B8))

Что делает результат расчета:

#VALUE!

Если я отменю то, что делает Excel, вручную восстановив мою формулу (вручную отредактировав ячейку и удалив «@»), я получу желаемое вычисленное среднее значение, как я и ожидал.


person Fareanor    schedule 19.04.2021    source источник
comment
Связано.   -  person BigBen    schedule 19.04.2021
comment
@BigBen Да, я уже нашел такие ответы, но они в VBA.   -  person Fareanor    schedule 19.04.2021
comment
@Fareanor @ — это неявный оператор пересечения. По мнению BigBen, решение вашей проблемы состоит в том, чтобы писать в .Formula2, а не в .Formula. Если xlswriter (пока) этого не поддерживает, это ошибка xlswriter, а не Excel.   -  person chris neilsen    schedule 20.04.2021


Ответы (1)


В общем, если Excel вставляет @ в формулу, написанную XlsxWriter, это означает, что формула является формулой массива и должна быть записана с worksheet.write_array_formula() (хотя есть некоторые предостережения, см. ниже).

Итак, с вариантом вашего примера:

import xlsxwriter

workbook = xlsxwriter.Workbook('test.xlsx')
worksheet = workbook.add_worksheet()

worksheet.write_array_formula('A1', '=AVERAGE(TIMEVALUE(B1:B6))')

worksheet.write_column('B1', ['2:30'] * 6)

workbook.close()

Выход:

введите здесь описание изображения

Однако в последних версиях Excel появились динамические формулы и динамические массивы. Я думаю, что вы видите здесь Неявный оператор пересечения: @. В настоящее время я работаю над поддержкой динамических формул и массивов в XlsxWriter, но это все еще находится в стадии изучения. Кроме того, стоит отметить, что, хотя приведенная выше формула работает, она не отображается так, как в Excel 365, поскольку для обозначения формулы массива используются {} фигурные скобки. Они не отображаются в Excel 365. Но, как я уже сказал, я работаю над этим.

person jmcnamara    schedule 19.04.2021
comment
Спасибо за ответ. write_array_formula() принимает не одну ячейку (A1 в вашем примере), а диапазон ( входные параметры). Странно, что ваш пример работает (у меня нет). Может быть, это потому, что я использую версию строки-столбца. Во всяком случае, я попытался добавить скобки {} вокруг моей формулы, как вы также предложили, и, похоже, это работает! - person Fareanor; 20.04.2021