Jetons de formule et fonctions utilisateur
HotXLS expose des flux de jetons de formule appartenant à l'appelant pour une inspection sans perte et une réécriture protégée dans les deux moteurs de classeur, ainsi que des registres hiérarchiques de fonctions utilisateur pour le calcul personnalisé
Modèle de jetons
TXLSFormulaTokenClass, TXLSFormulaTokenKind et TXLSFormulaTokenSource classifient chaque TXLSFormulaToken et indiquent s'il provient d'un texte analysé, d'octets BIFF classiques ou d'une autre source prise en charge
| TXLSFormulaToken | Kind, Opcode, BaseOpcode, TokenClass, RawBytes, TextValue, NumberValue, IntegerValue, ArgumentCount, FunctionIndex, ExternSheetIndex, Row1, Col1, Row2, Col2, Row1Relative, Col1Relative, Row2Relative, Col2Relative, ReferenceUsesOffsets, Supported, ArrayRows, ArrayCols, ArrayValueCount et ArrayValues |
| TXLSFormulaTokenStream | DecodeBiff, Clone, CloneSyntaxTree, BindContext, CanCompileFor, CanWriteBiffAt, ReplaceReference, Count, Items, Source, FormulaText, FullyDecoded, Rgce, RgbExtra, BiffWritable et BiffVersion |
| TXLSCompiledFormula | CreateTokenStream renvoie un clone appartenant à l'appelant du flux de jetons de formule compilé |
| TXLSFormula | ArrayFormulaMode, FormulaLocale, MaxRow, MaxCol, FuncNamebyPtg, FuncArgsCntByPtg, GetCompiled, GetCompiledPreservingUnknownNames, GetCompiledR1C1, GetTokenStream, GetTranslated, GetStoreData, GetStoreDataExt, CanStoreData, BindUserDefinedFunctions, GetTExpData, SetMode, IsKnownFunction, GetFunctionNames et FunctionArgumentClass |
Chaque moteur de classeur compile et traduit les formules à travers une unique instance TXLSFormula partagée : GetCompiled analyse du texte de style A1 en un arbre syntaxique, GetCompiledR1C1 résout les références R1C1 par rapport aux coordonnées de la cellule où vit la formule, GetTranslated reconstruit un arbre à partir d'octets BIFF classiques, et la famille GetStoreData réécrit les octets de jetons pour le stockage. MaxRow et MaxCol bornent la grille de références que le compilateur accepte — le moteur XLSX les relève des défauts BIFF8 à la grille XLSX, et les références qui ne tiennent pas dans BIFF8 n'ont pas de forme ptg, si bien que les écrivains BIFF8 les signalent comme non encodables
ArrayFormulaMode est positionné pendant l'écriture du rgce d'un enregistrement ARRAY (une formule matricielle) : les références de classe valeur et les constantes de tableau se sérialisent alors en classe tableau (tAreaA / tArrayA), comme Excel les écrit lui-même. Avec des opérandes de classe valeur, Excel évalue la formule matricielle avec intersection implicite au lieu de la traiter comme une véritable formule matricielle, c'est pourquoi les moteurs lèvent le drapeau pour le rgce propre de l'enregistrement ARRAY
Inspection bornée d'une feuille stockée simple
TXLSCompiledFormula.ReadSimpleLeafInfo(ExpectedOwner, MaxBytes, MaxTextCharacters, AllowUnboundBiff) inspecte en place l'arbre syntaxique principal et tout flux de jetons retenu, sans clonage, décompilation, évaluation ni matérialisation de jetons ou tableaux ; le défaut d'AllowUnboundBiff est False
Les formes prises en charge sont une feuille absolue REF3D ou RANGE3D unique et un littéral de chaîne unique, avec exactement un jeton cohérent quand un flux est retenu ; expressions, références relatives ou par décalage, tableaux, données de tableaux externes, jetons inconnus, feuilles principale et retenue incohérentes et propriétaires liés étrangers renvoient fslkUnsupported sans changer les valeurs en cache ni l'état de calcul
| TXLSFormulaSimpleLeafKind | fslkUnsupported, fslkRange ou fslkLiteral ; inspectez Kind avant d'utiliser les autres champs de résultat |
| TXLSFormulaLeafOwnerState | flosNoRetainedStream signale l'absence de provenance de flux de jetons, flosUnboundStream un BIFF importé non lié, flosSameOwner une correspondance exacte de propriétaire lié, et flosForeignOwner rejette un propriétaire lié différent |
| TXLSFormulaSimpleLeafInfo | Un enregistrement de valeur sans chaîne contenant Kind, OwnerState, RangeType, ExternId, FirstRow, FirstCol, LastRow, LastCol, TextCharacters, StoredTextCharacters, ReadBytes, SyntaxNodes et TokenCount |
| Range coordinates and identity | Les coordonnées sont en base zéro ; ExternId est l'identifiant logique en base 1 de l'arbre syntaxique, plutôt que l'index filaire BIFF ; l'appelant doit le résoudre via le classeur épinglé et rejeter les classeurs externes, les étendues de feuilles, les feuilles manquantes ou les coordonnées hors de sa plage de capture prise en charge |
| Source costs | TextCharacters est la longueur de sortie du littéral en unités de code UTF-16, ou zéro pour une plage ; StoredTextCharacters somme le texte source retenu, le texte des jetons et le texte de syntaxe inspecté ; ReadBytes somme leur coût de texte à deux octets et les longueurs d'octets bruts retenues, y compris les représentations séparément retenues ; ces compteurs décrivent les entrées d'inspection bornée plutôt que l'usage total du tas |
| Syntax and token counts | SyntaxNodes vaut un pour une feuille compilée ordinaire ou deux quand les feuilles principale et retenue sont toutes deux vérifiées ; TokenCount vaut zéro sans flux ou un avec un flux retenu cohérent pris en charge |
| TXLSFormulaTokenStream.ReadSimpleLeafInfo | La couche inférieure prend le même propriétaire et les mêmes quotas, un ComparedLeaf facultatif et un ReferenceContext facultatif ; elle vérifie directement la syntaxe privée du flux, ses jetons et ses octets bruts ; ComparedLeaf ajoute des contrôles de cohérence de la feuille principale, tandis que ReferenceContext mappe les index externes de formules texte sérialisées sans copie |
| TXLSCompiledFormula.ReadSimpleLiteral | Prend les mêmes arguments, répète les contrôles de feuille, et renvoie un WideString appartenant à l'appelant seulement après que les quotas restants d'octets et de caractères couvrent aussi sa sortie ; les feuilles non prises en charge ou une capacité restante insuffisante lèvent EInvalidOperation |
ExpectedOwner doit être le calculateur exact attaché à la source consommée, et doit rester vivant et stable pendant toute l'inspection et l'extraction de littéraux ; un propriétaire manquant lève EArgumentException, des quotas négatifs lèvent EArgumentOutOfRangeException, et des entrées de source retenue trop grandes lèvent EInvalidOperation avant les comparaisons de contenu ou la copie de sortie
Une feuille ordinaire sans flux retenu n'établit pas son propriétaire d'origine ; un flux importé non lié ne porte pas non plus d'identité de classeur, si bien que AllowUnboundBiff=True explicite n'est approprié que lorsque l'appelant a déjà épinglé le calculateur source et validera l'identité de feuille locale avant de lire des cellules ; l'inspection de références importées accepte actuellement les références BIFF8 et rejette la représentation externe BIFF5 différente
Les champs de syntaxe historiques nommés FFirstRowRel, FFirstColRel, FLastRowRel et FLastColRel sont vrais pour des coordonnées absolues ; l'aide vérifie aussi les indicateurs relatifs de jetons indépendants et la représentation par décalage, si bien que les consommateurs n'ont pas besoin d'inférer des coordonnées absolues de ces noms historiques
Arbre syntaxique
CloneSyntaxTree renvoie un arbre analysé appartenant à l'appelant, composé de nœuds TXLSSyntaxItem, pour une inspection structurelle : chaque nœud signale son ItemType, sa charge utile littérale (Value, IntValue, DecValue), ses Spaces initiaux, ses liens d'arbre (Parent, Child, ChildCount), la feuille de référence sous forme de TXLSRangeItem via Range, et les données de constante tableau (ArrayRows, ArrayCols, ArrayValueCount et les entrées TXLSArraySerVal de ArrayValues). L'arbre est une copie détachée, si bien que son parcours ne touche jamais les formules compilées du classeur, et les membres de mutation (AddChild, PushChild, CopyObject, OffsetCopyReferences, AdjustForShift, et TXLSRangeItem.CopyObject / AdjustForShift) existent pour les outils qui réécrivent un arbre cloné avant recompilation
Points d'entrée du classeur
Tokens := Worksheet.ParseFormulaTokens('SUM(A1:A4)', 1, 1);
try
if Tokens.ReplaceReference(OldRef, NewRef) then
Worksheet.SetFormulaTokens(1, 1, Tokens);
finally
Tokens.Free;
end;
ParseFormulaTokens, GetFormulaTokens, FormulaTokensToText et SetFormulaTokens gardent la propriété explicite et valident le contexte, la version BIFF, la prise en charge des jetons, la propriété des tableaux et les bornes des références avant qu'une cellule ne soit modifiée
Registres de fonctions utilisateur
TXLSUserFunctionResolver et TXLSUserFunctionRegistry fournissent une recherche par nom via RegisterHandler, UnregisterHandler, Clear, Contains, TryGetHandler et Count
Workbook.RegisterUserFunction('NETMARGIN', CalculateNetMargin);
Workbook.RegisterGlobalUserFunction('FISCALYEAR', CalculateFiscalYear);
try
Workbook.Calculate;
finally
Workbook.UnregisterUserFunction('NETMARGIN');
Workbook.UnregisterGlobalUserFunction('FISCALYEAR');
end;
IXLSWorkbook, TXLSWorkbook et TXLSXWorkbook exposent RegisterUserFunction, UnregisterUserFunction, ClearUserFunctions, RegisteredUserFunctionCount, RegisterGlobalUserFunction, UnregisterGlobalUserFunction, ClearGlobalUserFunctions et RegisteredGlobalUserFunctionCount
Les points d'entrée équivalents au niveau de l'unité sont XLSRegisterGlobalUserFunction, XLSUnregisterGlobalUserFunction, XLSClearGlobalUserFunctions, XLSRegisteredGlobalUserFunctionCount et XLSGlobalUserFunctionRegistered
TXLSCalculator.OnUserFunctionResolve intervient avant le repli de l'événement hérité, et les gestionnaires de registre sont invoqués en dehors du verrou du registre afin qu'un gestionnaire puisse se désenregistrer en toute sécurité
Les noms de fonctions externes et de style macro dangereux sont bloqués avant l'évaluation des arguments et la recherche de gestionnaires, sauf si AllowUnsafeFormulaCallbacks est explicitement activé pour le classeur ou pour l'évaluation contextuelle individuelle ; les noms de fonctions utilisateur ordinaires restent disponibles par défaut
Diagnostics de formule
TXLSXFormulaIssueKind, TXLSXFormulaLocation et TXLSXFormulaIssue sont renvoyés par TXLSXWorkbook.AnalyzeFormulaIssues pour les fonctions manquantes, les références externes et les composants de dépendance circulaire
Inspection des feuilles de macros
TXLSSheetKind distingue les feuilles de calcul, les feuilles de macros, les feuilles de graphiques, les modules VBA et les enregistrements de feuilles inconnus via TXLSWorksheet.SheetKind ; TXLSMacroRisk, TXLSMacroCommandInfo et TXLSMacroCommandArray décrivent les résultats typés de TXLSWorksheet.ScanMacroCommands
Types d'ajustement automatique fusionnés et de tri
TXLSMergedAutoFitStrategy et TXLSXMergedAutoFitStrategy choisissent la croissance en premier, en dernier ou équilibrée pour les plages fusionnées, tandis que TXLSSortOrientation, TXLSSortFormulaMode et TXLSSortCompareEvent contrôlent le tri stable vertical ou horizontal et le déplacement des formules