Документация на 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, съдържащ статус, местен код и съобщение
Стойностите на формули като #DIV/0!, #REF!, празните низове, масивите, булевите стойности и датите остават различими стойности; неуспешният синтаксичен анализ, неподдържаните функции, цикличните препратки, забранените външни препратки, забранените unsafe обратни сигнали, отменянето, невалидните аргументи, недостъпните листове и изчерпването на ресурсите използват изрични API статуса

Преизползваеми неизменими шаблони

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

Опции за ресурси, външни препратки и обратни сигнали

AllowExternalReferencesПо подразбиране е true, но допуска само изрично регистрирани цели в работното пространство или файлово-локални кешове и никога не извършва неявен достъп до файл или мрежа
AllowUnsafeFormulaCallbacksПо подразбиране е false и блокира опасни имена на функции да достигнат регистър на потребителски функции или обратен сигнал, преди да бъде изчислен някой аргумент; отказът връща xlfeUnsafeFunctionDenied
CancelFlagНезадължителен булев указател, проверяван преди и след изчислението
MaxFormulaLengthПо подразбиране 8192 UTF-16 кодови единици
MaxEvaluationStepsПо подразбиране 1,000,000 изчисления на синтактични елементи
MaxRecursionDepthПо подразбиране 256 вложени изчисления на формули
MaxArrayBytesПо подразбиране 64 MiB за генерираните масивни полезни натоварвания
Нула или отрицателен максимум изключва съответното ограничение за извикването; политиката за масивна памет в цялата книга продължава да се прилага, а достигането на включено ограничение връща 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