Документация HotXLS

Метод TryGetCachedFormulaValue

Читает сохранённый результат формулы, не вычисляя формулу и не изменяя состояние книги

Метод доступен как в IXLSWorkbook , так и в TXLSXWorkbook; реализация пакетной книги охватывает файлы XLSX и ODS

Код, нейтральный к движку, может получить IXLSFormulaCacheReader от любого движка через CreateFormulaCacheReader и использовать один и тот же метод запроса

Синтаксис

function TryGetCachedFormulaValue(
  SheetIndex, Row, Col: Integer;
  out AInfo: TXLSFormulaCacheInfo): Boolean;

Координаты и возвращаемое значение

SheetIndex, Rowи Col используют нумерацию от единицы

Метод возвращает True только для ячейки с формулой, состояние кэша которой — xlfcsLoaded или xlfcsCalculated

Недопустимые координаты, отсутствующие ячейки и ячейки без формул возвращают False с xlfcsNotFormula

Формула без сохранённого результата возвращает False с xlfcsMissing; ранее кэшированная формула, чья формула или вычисление завершились сбоем после изменения, возвращает False с xlfcsInvalidated

Сведения о кэше

The TXLSFormulaCacheInfo запись классифицирует кэш через два перечисления, объявленных в lxStandard: State is a TXLSFormulaCacheState and Kind a TXLSFormulaCacheValueKind

ПолеЗначение
State (TXLSFormulaCacheState)xlfcsNotFormula, xlfcsMissing, xlfcsLoaded, xlfcsCalculatedили xlfcsInvalidated
Kind (TXLSFormulaCacheValueKind)xlfcvBlank, xlfcvNumber, xlfcvDateTime, xlfcvString, xlfcvBooleanили xlfcvError
ValueСобственное кэшированное значение Variant, когда метод возвращает True, иначе Unassigned

Пустые результаты, пустые строки, логическое false, числовой ноль и ошибки сохраняют собственные виды и не используются как заместители наличия кэша

Числовые кэши BIFF остаются Double , поскольку у записи нет маркера типа даты; кэши ошибок возвращаются как varError

Для пакетных книг значения дат OOXML t="d" и ODF возвращают varDate, OOXML t="e" — varError, а кэшированная пустая ячейка ODF сохраняется с типом значения void value type

Изменение формулы делает её прежний кэш недействительным, а присваивание кэшированного значения с последующим присваиванием её формулы записывает вычисленный кэш

Каждый член общей формулы удерживает собственное наличие и значение кэша; последователь без сохранённого результата сообщает xlfcsMissing вместо наследования кэша корневого члена

Контракт без вычисления

Метод выполняет прямой поиск по разреженной ячейке и никогда не вызывает калькулятор, обратный вызов пользовательской функции, декомпиляцию токенов формулы, обновления зависимостей, записи кэша или изменения состояния изменённости

Когда требуется вычисление, используйте обычное свойство Value ячейки

Время жизни читателя

CreateFormulaCacheReader возвращает адаптер только для чтения с арендой на время жизни книги, не передавая владение книгой

После уничтожения книги любой запрос через этот адаптер вызывает EXLSFormulaCacheReaderInvalidated вместо разыменования освобождённого состояния книги

Пример

Reader := Workbook.CreateFormulaCacheReader;
if Reader.TryGetCachedFormulaValue(1, 4, 2, Info) then
  Memo1.Lines.Add(VarToStr(Info.Value))
else if Info.State = xlfcsMissing then
  Memo1.Lines.Add('Formula has no stored result');

См. также