Docs HotXLS

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

TXLSFormulaTokenKind, 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
TXLSFormulaTokenStreamDecodeBiff, Clone, CloneSyntaxTree, BindContext, CanCompileFor, CanWriteBiffAt, ReplaceReference, Count, Items, Source, FormulaText, FullyDecoded, Rgce, RgbExtra, BiffWritable et BiffVersion
TXLSCompiledFormulaCreateTokenStream renvoie un clone appartenant à l'appelant du flux de jetons de formule compilé
TXLSFormulaArrayFormulaMode, 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

TXLSFormulaSimpleLeafKindfslkUnsupported, fslkRange ou fslkLiteral ; inspectez Kind avant d'utiliser les autres champs de résultat
TXLSFormulaLeafOwnerStateflosNoRetainedStream 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
TXLSFormulaSimpleLeafInfoUn enregistrement de valeur sans chaîne contenant Kind, OwnerState, RangeType, ExternId, FirstRow, FirstCol, LastRow, LastCol, TextCharacters, StoredTextCharacters, ReadBytes, SyntaxNodes et TokenCount
Range coordinates and identityLes 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 costsTextCharacters 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 countsSyntaxNodes 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.ReadSimpleLeafInfoLa 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.ReadSimpleLiteralPrend 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

Voir aussi