Класическите 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);
Вижте също