El XLS clásico y XLSX exponen el mismo contrato sin efectos secundarios para clasificar la entrada de fórmulas antes de que el llamador cambie una celda
Directiva compartida
TXLSFormulaEmptyStringMode =
(xlfesmClearCell, xlfesmPreserveString);
TXLSFormulaUnknownSymbolMode =
(xlfusmReject, xlfusmPreserve);
TXLSFormulaEntryPolicy = record
EmptyStringMode: TXLSFormulaEmptyStringMode;
UnknownFunctionMode: TXLSFormulaUnknownSymbolMode;
UnknownNameMode: TXLSFormulaUnknownSymbolMode;
end;
property FormulaEntryPolicy: TXLSFormulaEntryPolicy;
El IXLSWorkbook y el TXLSWorkbook clásicos exponen la propiedad junto con TXLSXWorkbook; XLSDefaultFormulaEntryPolicy borra la entrada vacía y rechaza las funciones desconocidas y los nombres definidos desconocidos
La propiedad del libro de trabajo se copia por valor y se valida de forma atómica al asignarla, de modo que los valores de enumeración no admitidos generan EArgumentOutOfRangeException sin cambiar la directiva anterior
Resultado de la validación
function ValidateFormulaEntry(Row, Col: Integer;
const Formula: WideString): TXLSFormulaEntryValidationResult;
TXLSFormulaEntryValidationResult = record
Issue: TXLSFormulaEntryIssue;
Action: TXLSFormulaEntryAction;
Symbol: WideString;
end;
Issue distingue ausencia de error, función desconocida, nombre desconocido, error de sintaxis, limitación del formato de destino y coordenadas de destino no válidas
Action selecciona borrar la celda, almacenar la cadena, almacenar la fórmula o rechazar, mientras que Symbol identifica una función o un nombre desconocido cuando se reconoció alguno
Texto vacío y fórmulas
Una entrada exactamente vacía devuelve xlfeaClearCell o xlfeaStoreString según EmptyStringMode
Una fórmula que devuelve una cadena vacía, como ="", sigue siendo una fórmula y devuelve xlfeaStoreFormula cuando el formato de destino puede representarla
El texto de la fórmula puede incluir u omitir un signo igual al inicio
La asignación de una cadena exactamente vacía a través de la propiedad Value normal de las celdas de XLS clásico o XLSX ahora aplica este modo directamente: el valor predeterminado elimina cualquier valor o fórmula existente, mientras que xlfesmPreserveString reemplaza el contenido de la celda por una cadena constante de longitud cero
Null y Unassigned siempre borran la celda en cualquier modo, mientras que una fórmula real como ="" sigue siendo una fórmula con un resultado de cadena vacía almacenado o calculado de forma independiente
Los escritores de filas o columnas de cadenas y Variant de XLSX aplican la misma regla sin materializar los huecos borrados y conservan el almacenamiento empaquetado siempre que los valores restantes sean representables en él
Los lectores nativos de XLS, XLSX y ODS y los convertidores de XLS a XLSX o de XLSX a XLS tratan los valores almacenados como entrada confiable, de modo que una cadena vacía constante a nivel de archivo sobrevive incluso cuando el libro de trabajo de destino conserva la directiva de entrada de usuario predeterminada
Símbolos desconocidos y formatos de destino
Las funciones de usuario registradas en el libro de trabajo o en el proceso y las devoluciones de llamada OnUserFunction o OnUserFunctionEx asignadas cuentan como conocidas durante la validación sin invocar un manejador, mientras que las llamadas no registradas conservan el nombre de la función en Symbol
El modo estricto devuelve xlfeaReject para funciones o nombres desconocidos; la asignación a través de la propiedad Formula normal de la celda rechaza antes de cambiar el valor, la caché de fórmulas o las dependencias
El modo de conservación retiene el diagnóstico y almacena la fórmula a través de la API normal de celdas; XLS clásico serializa una llamada desconocida mediante tokens de funciones de usuario de complementos BIFF y conserva el texto de los nombres desconocidos al guardar, volver a abrir y convertir entre XLS y XLSX
XLS clásico además compila las fórmulas conocidas mediante el escritor BIFF y devuelve xlfeiTargetFormatUnsupported cuando la expresión no puede representarse, mientras que XLSX acepta las funciones de fórmulas modernas conocidas admitidas por su modelo de fórmulas
La validación de XLSX reconoce LAMBDA, los invocables léxicos LET , los nombres definidos que hacen referencia a lambdas, los marcadores de posición de informes, los vínculos externos de libros de trabajo registrados y las referencias estructuradas calificadas o no calificadas válidas, incluidas las formas anidadas y de fila actual
El modo de compatibilidad también puede retener referencias estructuradas externas sin resolver para procesarlas más adelante, mientras que el modo estricto sigue rechazando los nombres de tabla sin resolver
Cálculo y auditoría masiva
Una función desconocida conservada que sigue sin controlarse tras el envío a lambdas y funciones de usuario, o un nombre desconocido conservado, se evalúa como un error Variant con el código $1D, el error de Excel #NAME? ; el mismo error con tipo se propaga a través de las fórmulas dependientes y de la evaluación contextual
Las funciones integradas conocidas que no están implementadas siguen siendo distintas de una llamada desconocida, mientras que registrar, reemplazar, quitar o borrar una función de usuario del libro de trabajo o del proceso y cambiar la fórmula de un nombre definido invalida el estado obsoleto de dependencias y cálculo
function AuditFormulaSymbols: TXLSFormulaSymbolIssues; overload;
function AuditFormulaSymbols(
out AStats: TXLSFormulaSymbolAuditStats):
TXLSFormulaSymbolIssues; overload;
TXLSFormulaSymbolIssueKind = (xlfsiUnknownFunction, xlfsiUnknownName,
xlfsiSyntaxError);
TXLSFormulaSymbolLocationKind = (xlfslCell, xlfslDefinedName);
TXLSFormulaSymbolIssue = record
Kind: TXLSFormulaSymbolIssueKind;
LocationKind: TXLSFormulaSymbolLocationKind;
Sheet: Integer;
Row: Integer;
Col: Integer;
DefinedNameIndex: Integer;
DefinedName: WideString;
Formula: WideString;
Symbol: WideString;
end;
TXLSWorkbook y TXLSXWorkbook ofrecen las mismas sobrecargas de auditoría masiva; cada incidencia identifica una función desconocida, un nombre desconocido o un error de sintaxis junto con una ubicación de celda de hoja de cálculo o de un nombre definido, la fórmula de origen y el símbolo sin resolverLocationKind = xlfslCell) or a defined-name location (LocationKind = xlfslDefinedName), la fórmula de origen y el símbolo sin resolver
La auditoría recorre árboles de fórmulas analizados o tokens BIFF almacenados en lugar de examinar texto, de modo que un texto con apariencia de función dentro de una cadena no se notifica; la compilación de XLSX usa una caché local de la operación con clave basada en el texto de la fórmula resuelto, la hoja de cálculo, la configuración regional, la generación de los nombres definidos, las generaciones de los registros de funciones de usuario y la disponibilidad de las devoluciones de llamada
EntryCount informa de las fórmulas auditadas, UniqueFormulaCount informa de las fórmulas compiladas o inspeccionadas de forma independiente y CacheHitCount informa de las entradas repetidas atendidas por la caché de la operación
Sin mutación de la hoja de cálculo
La validación no crea ni edita una celda, no cambia los valores almacenados en caché, no actualiza el grafo de dependencias, no marca el libro de trabajo como modificado y no invoca un manejador de funciones de usuario registrado
La validación directa permanece libre de mutaciones; la asignación normal de fórmulas aplica internamente la misma decisión y solo confirma después de que la validación y la preparación del formato de destino se hayan realizado correctamente
Ejemplo de Delphi
Policy := Workbook.FormulaEntryPolicy;
Policy.UnknownFunctionMode := xlfusmReject;
Policy.UnknownNameMode := xlfusmReject;
Workbook.FormulaEntryPolicy := Policy;
Validation := Sheet.ValidateFormulaEntry(4, 2, FormulaText);
if Validation.Action = xlfeaStoreFormula then
Sheet.Cells[4, 2].Formula := FormulaText;
Issues := Workbook.AuditFormulaSymbols(Stats);
for I := 0 to High(Issues) do
if Issues[I].Kind = xlfsiUnknownFunction then
LogUnknownSymbol(Issues[I].Symbol);Véase también