Documentación HotXLS

Evaluación contextual de fórmulas

Las hojas de cálculo XLS clásicas y XLSX exponen la misma API de solo lectura para evaluar texto de fórmula como si se hubiera introducido en una fila y columna basadas en uno elegidas

Evaluación de una sola llamada

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;
La hoja de cálculo aporta el contexto de nombres locales, referencias sin calificar, tablas y vínculos externos sin cambiar la hoja activa, la selección, el modelo de celdas, la caché de fórmulas, el estado de modificación ni el grafo de dependencias
xlfrsA1 preserva las referencias absolutas y mixtas mientras resuelve las referencias relativas desde la celda de destino; xlfrsR1C1 resuelve los desplazamientos relativos directamente desde ese destino

Resultados con tipo

TXLSFormulaEvaluationResult devuelve Status, el Value con tipo original, IsVolatile y un registro Issue estable que contiene el estado, el código nativo y el mensaje
TXLSFormulaEvaluationStatus = (xlfeOk, xlfeInvalidArgument,
  xlfeWorksheetUnavailable, xlfeParseError, xlfeUnsupportedFunction,
  xlfeCircularReference, xlfeExternalReferenceDenied, xlfeCancelled,
  xlfeResourceLimit, xlfeFailed, xlfeUnsafeFunctionDenied);

TXLSFormulaEvaluationIssue = record
  Status: TXLSFormulaEvaluationStatus;
  NativeCode: Integer;
  Message: WideString;
end;
    
Los valores de fórmula como #DIV/0!, #REF!, las cadenas vacías, las matrices, los valores booleanos y las fechas siguen siendo valores distinguibles; los fallos de análisis, las funciones no compatibles, las referencias circulares, las referencias externas denegadas, las devoluciones de llamada no seguras denegadas, la cancelación, los argumentos no válidos, las hojas de cálculo no disponibles y el agotamiento de recursos usan estados explícitos de la API. Issue.NativeCode transporta el código de error subyacente del motor y Issue.Message la descripción legible cuando Status no es xlfeOk

Plantillas inmutables reutilizables

function CreateFormulaEvaluationTemplate(Row, Col: Integer;
  const Formula: WideString;
  ReferenceStyle: TXLSFormulaReferenceStyle): IXLSFormulaEvaluationTemplate;
Una plantilla compila la fórmula una vez en su ancla y expone EvaluateAt y EvaluateAtWithOptions para evaluaciones repetidas en distintas celdas de destino
Las fórmulas A1 y R1C1 ordinarias reutilizan directamente el árbol compilado; las referencias estructuradas A1 cuyo significado depende de la fila de la tabla de destino se resuelven y compilan para ese contexto de destino
Las plantillas no mantienen ningún estado modificable de la hoja de cálculo, informan de forma segura xlfeWorksheetUnavailable después de la destrucción del libro y recurren a la recompilación con conocimiento del contexto cuando los cambios del libro dejan obsoleto el contexto compilado original

Opciones de recursos, referencias externas y devoluciones de llamada

AllowExternalReferencesSu valor predeterminado es true, pero solo permite destinos de área de trabajo registrados explícitamente o cachés locales del archivo, y nunca realiza acceso implícito a archivos o a la red
AllowUnsafeFormulaCallbacksSu valor predeterminado es false y bloquea los nombres de funciones peligrosos para que no lleguen a un registro de funciones de usuario o a una devolución de llamada antes de evaluar cualquier argumento; la denegación devuelve xlfeUnsafeFunctionDenied
CancelFlagPuntero booleano opcional comprobado antes y después de la evaluación
MaxFormulaLengthSu valor predeterminado es 8192 unidades de código UTF-16
MaxEvaluationStepsSu valor predeterminado es 1,000,000 evaluaciones de elementos de sintaxis
MaxRecursionDepthSu valor predeterminado es 256 evaluaciones de fórmulas anidadas
MaxArrayBytesSu valor predeterminado es 64 MiB para las cargas de matrices generadas
Un máximo de cero o negativo deshabilita ese límite por llamada; la directiva de memoria de matrices de todo el libro sigue aplicándose, y alcanzar un límite habilitado devuelve xlfeResourceLimit después de liberar el estado de evaluación temporal
La sobrecarga que acepta opciones explícitas trata AllowUnsafeFormulaCallbacks como autoritativa para esa llamada; la evaluación predeterminada de una sola llamada y la de plantillas heredan la propiedad del libro del mismo nombre

Ejemplo de 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);

Ejemplo de C++Builder

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

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

Véase también

Método TXLSWorksheet.Calculate
Método IXLSWorkbook.Calculate
Motor de cálculo de Excel