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

Контекстне обчислення формул

Аркуші класичного XLS та XLSX відкривають однаковий API лише для читання для обчислення тексту формули так, ніби її було введено у вибраному рядку та стовпці з нумерацією від одиниці

Одноразове обчислення

function EvaluateFormulaAt(Row, Col: Integer;
  const Formula: WideString): TXLSFormulaEvaluationResult; overload;

function EvaluateFormulaAt(Row, Col: Integer;
  const Formula: WideString;
  ReferenceStyle: TXLSFormulaReferenceStyle;
  const Options: TXLSFormulaEvaluationOptions): TXLSFormulaEvaluationResult; overload;
Аркуш надає контекст локальних імен, некваліфікованих посилань, таблиць і зовнішніх посилань, не змінюючи активний аркуш, виділення, модель комірок, кеш формул, стан зміненості чи граф залежностей
xlfrsA1 зберігає абсолютні та змішані посилання, розв'язуючи відносні посилання від цільової комірки; xlfrsR1C1 розв'язує відносні зміщення безпосередньо від цієї цілі

Типізовані результати

TXLSFormulaEvaluationResult повертає Status, початкове типізоване Value, IsVolatile і стабільний запис Issue зі станом, первинним кодом та повідомленням
TXLSFormulaEvaluationStatus = (xlfeOk, xlfeInvalidArgument,
  xlfeWorksheetUnavailable, xlfeParseError, xlfeUnsupportedFunction,
  xlfeCircularReference, xlfeExternalReferenceDenied, xlfeCancelled,
  xlfeResourceLimit, xlfeFailed, xlfeUnsafeFunctionDenied);

TXLSFormulaEvaluationIssue = record
  Status: TXLSFormulaEvaluationStatus;
  NativeCode: Integer;
  Message: WideString;
end;
    
Значення формул, як-от #DIV/0!, #REF!, порожні рядки, масиви, логічні значення та дати, залишаються розрізнюваними значеннями; збої розбору, непідтримувані функції, циклічні посилання, заборонені зовнішні посилання, заборонені небезпечні зворотні виклики, скасування, недійсні аргументи, недоступні аркуші та вичерпання ресурсів використовують явні стани API. Issue.NativeCode містить код помилки рушія, а Issue.Message — зрозумілу для людини назву, коли Status — не xlfeOk

Багаторазові незмінні шаблони

function CreateFormulaEvaluationTemplate(Row, Col: Integer;
  const Formula: WideString;
  ReferenceStyle: TXLSFormulaReferenceStyle): IXLSFormulaEvaluationTemplate;
Шаблон один раз компілює формулу у своїй точці прив'язки та відкриває EvaluateAt і EvaluateAtWithOptions для повторного обчислення в різних цільових комірках
Звичайні формули A1 і R1C1 повторно використовують скомпільоване дерево безпосередньо; структуровані посилання A1, сенс яких залежить від рядка цільової таблиці, розв'язуються та компілюються для цього цільового контексту
Шаблони не зберігають доступний для запису стан аркуша, безпечно повідомляють xlfeWorksheetUnavailable після знищення книги та переходять до повторної компіляції з урахуванням контексту, коли зміни книги роблять початковий скомпільований контекст застарілим

Параметри ресурсів, зовнішніх посилань і зворотних викликів

AllowExternalReferencesТипово true, але дозволяє лише явно зареєстровані цілі робочої області або локальні для файлу кеші й ніколи не виконує неявний доступ до файлів чи мережі
AllowUnsafeFormulaCallbacksТипово false і блокує потрапляння небезпечних імен функцій до реєстру користувацьких функцій чи зворотного виклику до обчислення будь-якого аргументу; при відмові повертається xlfeUnsafeFunctionDenied
CancelFlagНеобов'язковий вказівник на Boolean, який перевіряється до та після обчислення
MaxFormulaLengthТипово 8192 кодові одиниці UTF-16
MaxEvaluationStepsТипово 1,000,000 обчислень елементів синтаксису
MaxRecursionDepthТипово 256 вкладених обчислень формул
MaxArrayBytesТипово 64 МіБ для створюваних масивів даних
Нульове або від'ємне максимальне значення вимикає відповідний ліміт на виклик; політика пам'яті масивів для всієї книги все одно застосовується, а досягнення увімкненого ліміту повертає xlfeResourceLimit після звільнення тимчасового стану обчислення
Перевантаження, що приймає явні параметри, вважає AllowUnsafeFormulaCallbacks визначальним для цього виклику; одноразове обчислення типово та обчислення шаблону успадковують однойменну властивість книги

Приклад для Delphi

Template := Sheet.CreateFormulaEvaluationTemplate(2, 2,
  '=R[-1]C[-1]+1', xlfrsR1C1);

Result := Template.EvaluateAt(2, 2);
if Result.Status = xlfeOk then
  UseValue(Result.Value);

Options := XLSDefaultFormulaEvaluationOptions;
Options.MaxEvaluationSteps := 10000;
Result := Template.EvaluateAtWithOptions(20, 4, Options);

Приклад для C++Builder

Lxcalc::_di_IXLSFormulaEvaluationTemplate evalTemplate =
  sheet->CreateFormulaEvaluationTemplate(1, 1,
    WideString(L"=ROW()+COLUMN()"), Lxcalc::xlfrsA1);

Lxcalc::TXLSFormulaEvaluationResult result =
  evalTemplate->EvaluateAt(7, 8);

Див. також

Метод TXLSWorksheet.Calculate
Метод IXLSWorkbook.Calculate
Рушій обчислень Excel