Работа с формулами
Обзор
Aspose.Cells FOSS хранит формулы в виде совместимых со Excel строк. Библиотека не вычисляет формулы внутренне — она сохраняет выражение дословно в файле, а приложение для работы с электронными таблицами (Excel, LibreOffice Calc или любой совместимый просмотрщик) вычисляет результат при открытии файла.
Существует два способа разместить формулу в ячейке:
- Конструктор Cell —
ws.cells["A4"] = Cell(None, "=SUM(A1:A3)") .formulaсвойство —ws.cells["A4"].formula = "=SUM(A1:A3)"
Оба подхода хранят одни и те же данные. Конструкторская форма компактна, когда вы
создаёте лист с нуля; форма свойства более естественна, когда у вас уже есть ссылка на существующую ячейку и вы хотите присоединить к ней формулу.
Установка формулы через конструктор ячейки
Конструктор 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.
| Purpose | Formula string | Notes |
|---|---|---|
| Суммировать диапазон | =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, затем записывает формулы SUM, AVERAGE, MAX и MIN в столбец B и сохраняет результат в файл 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". Библиотека с открытым исходным кодом не переводит и не проверяет строку диапазона — недопустимый диапазон будет сохранён дословно и вызовет ошибку в считывателе таблиц при открытии.
Формулы хранятся как строки, не вычисляются
Aspose.Cells FOSS не включает движок формул. Если вам нужен вычисленный
результат формулы в Python (например, для дальнейших вычислений),
вычислите значение самостоятельно и запишите его как статическое значение с .value. Используйте
формулы только тогда, когда конечный пользователь откроет файл в табличном приложении,
способном их вычислять.
См. также
- Справочник API: Полная документация классов и методов для
aspose.cells_foss - База знаний: Практические руководства, ориентированные на задачи
- Обзор продукта: Сводка функций и возможностей
- Начало работы / Установка: pip install и настройка
- Блог: Представляем Aspose.Cells FOSS: Обзор библиотеки и быстрый старт