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 ingresado 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 conserva las referencias absolutas y mixtas mientras resuelve las referencias relativas desde la celda de destino; xlfrsR1C1 resuelve los desplazamientos relativos directamente desde ese destino
CELL sin una referencia explícita inspecciona la celda destino suministrada; use $A$1 para inspeccionar la primera celda fija desde cualquier destino, mientras que A1 se resuelve relativa a ese destino bajo el contrato del contexto A1
Los metadatos de CELL respaldados por modelo y INFO("recalc") también funcionan a través de vistas de solo lectura del libro sin cambiar su generación ni las cachés de fórmulas almacenadas; CELL("width",reference) conserva su arreglo de una fila y dos columnas, y los formatos personalizados sin clasificar devuelven xlfeUnsupportedFunction en lugar de inventar un código de formato; consulte metadatos de CELL e INFO para los límites completos de headless y configuración regional

Resultados con tipo

FORMULATEXT inspecciona los metadatos de fórmula almacenados a través de ambos motores de hoja y de las vistas de solo lectura sin calcular el destino inspeccionado; GETPIVOTDATA evalúa una instantánea separada de la caché existente de una tabla dinámica local y respeta los presupuestos de evaluación y la cancelación; los agregados visibles ausentes siguen siendo valores #REF! con tipo, mientras que los modelos de tabla dinámica incompletos o no soportados devuelven xlfeUnsupportedFunction; consulte inspección de texto de fórmula y datos visibles de tabla dinámica para los límites de almacenamiento, arreglos y caché
TXLSFormulaEvaluationResult devuelve Status, el Valuecon tipo original, IsVolatiley 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; las fallas de análisis, las funciones no admitidas, las referencias circulares, las referencias externas denegadas, las devoluciones de llamada no seguras denegadas, la cancelación, los argumentos inválidos, las hojas de cálculo no disponibles y el agotamiento de recursos usan estados explícitos de la API Issue.NativeCode lleva el código de error subyacente del motor e Issue.Message la descripción legible para humanos 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, reportan de forma segura xlfeWorksheetUnavailable después de la destrucción del libro de trabajo y recurren a la recompilación con conocimiento del contexto cuando los cambios del libro de trabajo dejan obsoleto el contexto compilado original

Opciones de recursos, referencias externas y devoluciones de llamada

AllowExternalReferencesEl valor predeterminado es true, pero solo permite destinos del área de trabajo registrados explícitamente o cachés locales del archivo, y nunca realiza acceso implícito a archivos o a la red
AllowUnsafeFormulaCallbacksEl 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
MaxFormulaLengthEl valor predeterminado es 8192 unidades de código UTF-16
MaxEvaluationStepsEl valor predeterminado es 1,000,000 evaluaciones de elementos de sintaxis
MaxRecursionDepthEl valor predeterminado es 256 evaluaciones de fórmulas anidadas
MaxArrayBytesEl 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 política de memoria de matrices de todo el libro de trabajo 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 autoritaria para esa llamada; la evaluación predeterminada de una sola llamada y la de plantillas heredan la propiedad del libro de trabajo 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);

La API directa del backend de expresiones regulares documenta el emparejamiento, el reemplazo, los estados y los presupuestos por instancia del llamador

Las fórmulas REGEX comparten los controles de trabajo, memoria y cancelación del contexto de evaluación vigente, incluidas las asignaciones de workspace y de salida de PCRE2; una cancelación o un límite de recursos produce un estado explícito sin un resultado parcial de extracción o reemplazo

GROUPBY y PIVOTBY resumen arreglos separados o instantáneas de rangos de hoja de cálculo en el contexto vigente, incluidos los entornos Lambda capturados, los índices de agrupamiento, los vectores de callback y el almacenamiento de salida; los límites de recursos y la cancelación devuelven estados explícitos sin cambiar los datos, las cachés ni el diseño de la hoja de cálculo

Véase también

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