Documentación HotXLS

Motor de cálculo de Excel

Información general

HotXLS incluye un motor integrado para analizar y calcular fórmulas; este motor evalúa las fórmulas de celda de forma programática dentro de su proceso, eliminando la necesidad de llamar a Excel o controladores OLE externos para resolver los valores calculados del libro

Ejecución del cálculo

Antes de guardar o exportar, active un recálculo completo del libro con la interfaz principal del libro

procedure Calculate;

El motor admite las familias estándar de funciones matemáticas, de fecha, lógicas, de cadena y estadísticas; resuelve secuencialmente las dependencias de celda y sigue las cadenas de referencia para evitar referencias circulares

Evaluación contextual de fórmulas

TXLSWorksheet y TXLSXWorksheet exponen EvaluateFormulaAt para calcular texto de fórmulas en una fila y columna seleccionadas de base uno, sin escribir una celda temporal ni cambiar el estado de cálculo del libro de trabajo

Los estilos de referencia A1 y R1C1, los nombres locales, las referencias estructuradas, las dependencias de fórmulas, las raíces de matrices, los valores de error de Excel con tipos, el estado volátil, la autorización explícita de referencias externas, la cancelación y las categorías de fallo estables comparten el evaluador normal del libro de trabajo

CreateFormulaEvaluationTemplate compila un ancla inmutable una sola vez y la reutiliza en las celdas de destino; las referencias estructuradas A1 sensibles a la fila de destino se resuelven para cada contexto de destino, y los límites por llamada acotan la longitud de la fórmula, los pasos de elementos de sintaxis, la profundidad de recursión y los bytes de las matrices generadas

Véase Evaluación contextual de fórmulas para conocer los tipos de resultado, los presupuestos predeterminados, las reglas de vigencia y los ejemplos de Delphi y C++Builder

Operadores de matriz

Los operadores aritméticos, de comparación, de concatenación, de negación unaria y de porcentaje aceptan matrices calculadas además de valores escalares

Un escalar se difunde por todos los elementos, y una matriz de una fila o de una columna se difunde por una dimensión compatible; las formas incompatibles devuelven #VALUE!

Los errores se conservan en sus celdas de resultado individuales, de modo que una división por cero o un elemento no válido no descarta los valores calculados para las demás celdas

COMBINA y PERMUTATIONA comparten la semántica escalar y de difusión de matrices con argumentos enteros no negativos truncados y desbordamiento comprobado, mientras que MUNIT devuelve una matriz identidad Double compacta de dos dimensiones

FormulaArrayMemoryLimit tiene un valor predeterminado de 64 MiB y acota las cargas de matrices generadas; MUNIT también valida el área de derrame restante de la hoja de cálculo en lugar de imponer un techo fijo de dimensiones

Inspección de la presencia de fórmulas

ISFORMULA(reference) inspecciona la titularidad de la fórmula sin calcular la celda referenciada, de modo que una fórmula sigue siendo detectable cuando su resultado en caché es un error o una cadena vacía

Un rango rectangular devuelve una matriz booleana de la misma forma; los miembros de fórmulas compartidas y de fórmulas de matriz clásicas o XLSX devuelven true, mientras que solo el ancla de un derrame dinámico es una celda con fórmula

Los valores directos y los nombres definidos escalares devuelven #VALUE!, las referencias no válidas conservan #REF!, y las matrices booleanas generadas están acotadas por FormulaArrayMemoryLimit

XLSX escribe _xlfn.ISFORMULA y restaura el nombre sin prefijo al abrir, ODS usa la sintaxis estándar of:=ISFORMULA, y la salida XLS clásica rechaza la función futura no admitida antes de confirmar los datos

Funciones de texto modernas

UNICHAR trunca las entradas numéricas hacia cero y convierte valores escalares Unicode válidos a UTF-16, incluida la salida de pares suplentes para los planos suplementarios y todos los rangos de uso privado

Las entradas cero y fuera de rango devuelven #VALUE!, mientras que los puntos de código suplentes aislados y los no caracteres Unicode devuelven #N/A; las entradas de rango y de matriz generada conservan estos errores por elemento

BAHTTEXT convierte números finitos a texto de bahts y satangs tailandeses, redondea los valores intermedios alejándolos de cero con dos decimales, conserva el signo negativo cuando la magnitud redondeada llega a cero y expande la notación científica sin pasar por un tipo entero

XLSX guarda UNICHAR como _xlfn.UNICHAR y restaura el nombre sin prefijo al volver a abrir; BAHTTEXT usa su identidad de función estándar y permanece sin prefijo en las fórmulas XLS y XLSX

Regresión y predicción

LINEST y LOGEST aceptan una o más columnas o filas predictoras y devuelven los coeficientes en el orden de Excel seguidos del intercepto opcional

Cuando el argumento de estadísticas es true, ambas funciones devuelven el resultado completo de cinco filas, que contiene los errores de los coeficientes, las estadísticas de ajuste, el estadístico F, los grados de libertad, la suma de cuadrados de la regresión y la suma de cuadrados de los residuos

TREND y GROWTH usan el mismo modelo multivariable y conservan la forma de fila o columna de los nuevos valores predictores suministrados

Recálculo de dependencias de XLS clásico

TXLSWorkbook.Recalculate construye un grafo de dependencias de fórmulas en su primera llamada y evalúa las fórmulas dando prioridad a los precedentes, en lugar del orden físico de las celdas

Las llamadas posteriores reutilizan el grafo y recalculan solo los dependientes transitivos de los valores cambiados más las fórmulas volátiles; las ediciones de fórmulas, los nombres, la estructura de la hoja de cálculo y las reescrituras de referencias invalidan y reconstruyen el grafo de forma segura

Las referencias circulares usan la configuración EnableIteration, MaxIterations y MaxIterationChange del libro clásico, mientras que UseFullPrecision=False aplica la precisión numérica mostrada a los resultados en caché y a sus cálculos posteriores

Dependencias de nombres definidos

El cálculo incremental sigue los nombres con ámbito de libro de trabajo y de hoja de cálculo a través de fórmulas anidadas y referencias de varias áreas

Las fórmulas de nombres acíclicos aportan sus dependencias de celda exactas, mientras que los ciclos de nombres recursivos recurren de forma segura al recálculo volátil

Tablas de datos What-If

Tanto las hojas de cálculo XLS clásicas como las XLSX modernas pueden crear, calcular, leer, escribir, copiar y ajustar estructuralmente tablas de datos What-If de una o dos variables

function AddDataTable(
  const AResultRange, ARowInputCell, AColumnInputCell: WideString
): TXLSDataTable;

El rango de resultados contiene solo celdas de salida calculadas, mientras que las fórmulas y los valores de prueba usan las celdas circundantes con la misma disposición que Excel

  • Tabla de entrada por columna — deje ARowInputCell vacío, coloque una fórmula de origen encima de cada columna de resultados y coloque los valores de prueba a la izquierda de las filas de resultados
  • Tabla de entrada por fila — deje AColumnInputCell vacío, coloque una fórmula de origen a la izquierda de cada fila de resultados y coloque los valores de prueba encima de las columnas de resultados
  • Tabla de dos variables — suministre ambas celdas de entrada, coloque la fórmula de origen encima y a la izquierda del rango de resultados, los valores de prueba de entrada por fila encima de los resultados y los valores de prueba de entrada por columna a la izquierda
Sheet.Range['B1', 'B1'].Value := 0;
Sheet.Range['D1', 'D1'].Formula := '=B1*2+1';
Sheet.Range['C2', 'C2'].Value := 1;
Sheet.Range['C3', 'C3'].Value := 2;
Sheet.Range['C4', 'C4'].Value := 3;

Table := Sheet.AddDataTable('D2:D4', '', 'B1');
Workbook.Recalculate;

Este ejemplo de entrada por columna calcula 3, 5 y 7 en D2:D4; cada valor de prueba se aplica mediante un contexto de cálculo aislado, de modo que las fórmulas que llegan a B1 indirectamente a través de otras celdas con fórmula se recalculan correctamente

AddDataTable devuelve nil para un rango no válido, una referencia de entrada no válida o cuando ambas referencias de entrada están vacías; la colección DataTables de la hoja de cálculo expone la definición resultante y sus indicadores de entrada eliminada

Eliminar una celda de entrada referenciada conserva la definición de la tabla y devuelve #REF! para sus salidas, lo que coincide con la semántica del libro de trabajo almacenado

Funciones definidas por el usuario

Amplíe el motor de fórmula con lógica de negocio personalizada; registre sus propias funciones mediante los eventos siguientes

Los nombres peligrosos externos y de estilo macro se deniegan antes de que se ejecuten los argumentos o los controladores, salvo que el libro de trabajo o una evaluación contextual concreta habilite explícitamente AllowUnsafeFormulaCallbacks