Работа с формулами

Обзор

Aspose.Cells FOSS stores formulas as Excel-compatible strings. The library does not evaluate formulas internally — it preserves the expression verbatim in the file, and the spreadsheet application (Excel, LibreOffice Calc, or any compatible reader) computes the result when the file is opened.

Существует два способа разместить формулу в ячейке:

  1. Конструктор ячейки — ws.cells["A4"] = Cell(None, "=SUM(A1:A3)")
  2. .formula свойство — ws.cells["A4"].formula = "=SUM(A1:A3)"

Оба подхода сохраняют одни и те же данные. Форма через конструктор компактна, когда вы создаёте лист с нуля; форма через свойство более естественна, когда у вас уже есть ссылка на существующую ячейку и вы хотите прикрепить к ней формулу.


Установка формулы через конструктор Cell

Эта Cell подпись конструктора Cell(value, formula). Чтобы создать чистый формульную ячейку, передайте None в качестве значения и строку выражения в качестве второго аргумент:

from aspose.cells_foss import Workbook, Cell

workbook = Workbook()
ws = workbook.worksheets[0]

##Input values
ws.cells["A1"] = Cell(10)
ws.cells["A2"] = Cell(25)
ws.cells["A3"] = Cell(15)

##Formula cell: value=None, formula="=SUM(A1:A3)"
ws.cells["A4"] = Cell(None, "=SUM(A1:A3)")

workbook.save("formula_constructor.xlsx")
print("Saved formula_constructor.xlsx")

Настройка value=None делает явным, что у ячейки нет статического значения — её отображаемое содержимое полностью берётся из формулы. Передача не-None значения вместе с формулой допускается, но необычно; большинство программ чтения таблиц отобразит результат формулы и игнорировать сохранённое значение.


Установка формулы через .formula Свойство

Присвоить напрямую cell.formula когда у вас уже есть ссылка на ячейку или когда вы хотите добавить формулу в ячейку, которая ранее была записана со значением:

from aspose.cells_foss import Workbook

workbook = Workbook()
ws = workbook.worksheets[0]

##Write input data
for i, val in enumerate([4, 8, 15, 16, 23], start=1):
    ws.cells[f"A{i}"].value = val

##Attach a formula to an existing cell reference
cell = ws.cells["B1"]
cell.formula = "=AVERAGE(A1:A5)"

##Or assign directly by address
ws.cells["B2"].formula = "=MAX(A1:A5)"
ws.cells["B3"].formula = "=MIN(A1:A5)"

workbook.save("formula_property.xlsx")
print("Saved formula_property.xlsx")

Чтение формулы обратно

После записи ячейки с формулой используйте .formula чтобы получить строку выражения и .value чтобы получить любое статическое значение (если оно было), хранившееся рядом с ним.

from aspose.cells_foss import Workbook, Cell

workbook = Workbook()
ws = workbook.worksheets[0]

ws.cells["A1"] = Cell(None, "=SUM(B1:B5)")

cell = ws.cells["A1"]

print(cell.formula)   # =SUM(B1:B5)
print(cell.value)     # None  (no static value was set)

На практике, .value является None для любой ячейки, созданной с Cell(None, formula). Если вы загрузите существующую книгу, которая ранее была сохранена с вычисленными значениями кешированными рядом с формулами, .value может вернуть последний кешированный результат — но это поведение зависит от того, как исходное приложение сохранило файл, и должно не следует полагаться на него при новых вычислениях.

Чтобы в рантайме отличить ячейку с формулой от ячейки с обычным значением:

cell = ws.cells["A1"]
if cell.formula:
    print(f"Formula cell: {cell.formula}")
else:
    print(f"Value cell: {cell.value}")

Общие формулы Excel

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

ЦельСтрока формулыПримечания
Суммировать диапазон=SUM(A1:A10)Добавляет все числовые значения в диапазоне
Среднее значение диапазона=AVERAGE(A1:A10)Игнорирует пустые ячейки
Максимальное значение=MAX(A1:A10)Возвращает наибольшее число
Минимальное значение=MIN(A1:A10)Возвращает наименьшее число
Подсчитать числовые ячейки=COUNT(A1:A10)Считает только ячейки с числовыми значениями
Подсчитать непустые ячейки=COUNTA(A1:A10)Считает любую непустую ячейку
Условное значение=IF(A1>100,"High","Low")Трёхаргументная форма: тест, результат‑истина, результат‑ложь
Вертикальный поиск=VLOOKUP(D1,A1:B10,2,FALSE)Точное совпадение (FALSE) рекомендуется
Конкатенировать строки=CONCATENATE(A1," ",B1)Или используйте =A1&" "&B1
Округлить число=ROUND(A1,2)Второй аргумент — количество знаков после запятой

Все строки формул должны начинаться с =. Имена функций не чувствительны к регистру в файлах, совместимых с Excel, но традиционная форма в верхнем регистре показана выше для читаемости.


Полный пример

В следующем примере создаётся набор данных из пяти строк с числовыми значениями в столбце A, затем в столбец B записываются формулы SUM, AVERAGE, MAX и MIN, и результат сохраняется в файл XLSX.

from aspose.cells_foss import Workbook, Cell

workbook = Workbook()
ws = workbook.worksheets[0]

##--- Headers ---
ws.cells["A1"].value = "Value"
ws.cells["B1"].value = "Formula"
ws.cells["C1"].value = "Result (evaluated by Excel)"

##--- Input data in A2:A6 ---
input_values = [14, 28, 7, 35, 21]
for i, val in enumerate(input_values, start=2):
    ws.cells[f"A{i}"].value = val

##--- Formula labels in B column ---
ws.cells["B2"].value = "SUM"
ws.cells["B3"].value = "AVERAGE"
ws.cells["B4"].value = "MAX"
ws.cells["B5"].value = "MIN"

##--- Formulas in C column ---
ws.cells["C2"] = Cell(None, "=SUM(A2:A6)")
ws.cells["C3"] = Cell(None, "=AVERAGE(A2:A6)")
ws.cells["C4"] = Cell(None, "=MAX(A2:A6)")
ws.cells["C5"] = Cell(None, "=MIN(A2:A6)")

##--- Save ---
workbook.save("formulas_demo.xlsx")
print("Saved formulas_demo.xlsx")

При открытии этого файла в Excel или LibreOffice Calc столбец C будет отображать:

СтрокаФормулаОжидаемый результат
C2=SUM(A2:A6)105
C3=AVERAGE(A2:A6)21
C4=MAX(A2:A6)35
C5=MIN(A2:A6)7

Примечания

Строки формул должны начинаться с =

Библиотека сохраняет строку как есть. Пропуск ведущего = вызывает чтитель электронных таблиц воспринимать текст как буквальную строку, а не как формулу.

##Correct — starts with =
ws.cells["A1"].formula = "=SUM(B1:B5)"

##Wrong — treated as the literal text "SUM(B1:B5)", not a formula
ws.cells["A1"].formula = "SUM(B1:B5)"

Ссылки на диапазоны используют стандартную нотацию Excel A1

Диапазоны строк и столбцов записываются как FirstCell:LastCell с использованием заглавных букв столбцов и номеров строк, начинающихся с единицы: "A1:A10", "B2:D5", "C3:C3". FOSS библиотека не переводит и не проверяет строку диапазона — недопустимый диапазон будет будет сохранено дословно и вызовет ошибку в считывателе таблиц при открытии.

Формулы сохраняются как строки, а не вычисляются

Aspose.Cells FOSS does not include a formula engine. If you need the computed результат формулы в Python (например, для выполнения дальнейших вычислений), вычислите значение самостоятельно и запишите его как статическое значение с помощью .value. Используйте формулы только в том случае, если конечный пользователь будет открывать файл в приложении для работы с таблицами которое может их вычислять.

См. также

 Русский