Token di formula e funzioni utente
HotXLS espone flussi di token di formula di proprietà del chiamante per l'ispezione senza perdite e la riscrittura protetta in entrambi i motori della cartella di lavoro, oltre a registri gerarchici di funzioni utente per il calcolo personalizzato
Modello dei token
TXLSFormulaTokenClass, TXLSFormulaTokenKind e TXLSFormulaTokenSource classificano ogni TXLSFormulaToken e registrano se proviene da testo analizzato, byte BIFF classici o un'altra sorgente supportata
| 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 e ArrayValues |
| TXLSFormulaTokenStream | DecodeBiff, Clone, CloneSyntaxTree, BindContext, CanCompileFor, CanWriteBiffAt, ReplaceReference, Count, Items, Source, FormulaText, FullyDecoded, Rgce, RgbExtra, BiffWritable e BiffVersion |
| TXLSCompiledFormula | CreateTokenStream restituisce un clone di proprietà del chiamante del flusso di token della formula compilata |
| TXLSFormula | ArrayFormulaMode, FormulaLocale, MaxRow, MaxCol, FuncNamebyPtg, FuncArgsCntByPtg, GetCompiled, GetCompiledPreservingUnknownNames, GetCompiledR1C1, GetTokenStream, GetTranslated, GetStoreData, GetStoreDataExt, CanStoreData, BindUserDefinedFunctions, GetTExpData, SetMode, IsKnownFunction, GetFunctionNames e FunctionArgumentClass |
Ogni motore di cartella di lavoro compila e traduce le formule attraverso una singola istanza condivisa di TXLSFormula: GetCompiled analizza il testo in stile A1 in un albero di sintassi, GetCompiledR1C1 risolve i riferimenti R1C1 rispetto alle coordinate della cella in cui vive la formula, GetTranslated ricostruisce un albero dai byte BIFF classici, e la famiglia GetStoreData riscrive i byte dei token per la memorizzazione. MaxRow e MaxCol delimitano la griglia di riferimenti che il compilatore accetta — il motore XLSX li alza dai valori predefiniti di BIFF8 alla griglia XLSX, e i riferimenti che non stanno in BIFF8 non hanno forma ptg, così gli writer BIFF8 li segnalano come non codificabili
ArrayFormulaMode viene impostato mentre viene scritto il rgce di un record ARRAY (una formula di matrice): i riferimenti di classe valore e le costanti di matrice vengono così serializzati come classe matrice (tAreaA / tArrayA), come li scrive Excel stesso. Con operandi di classe valore Excel valuta la formula di matrice con intersezione implicita invece di trattarla come una vera formula di matrice, ed è per questo che i motori alzano il flag per il rgce del record ARRAY stesso
Ispezione limitata di una foglia memorizzata semplice
TXLSCompiledFormula.ReadSimpleLeafInfo(ExpectedOwner, MaxBytes, MaxTextCharacters, AllowUnboundBiff) esamina l'albero di sintassi principale e qualsiasi flusso di token trattenuto in place, senza clonare, decompilare, valutare o materializzare token o array; il valore predefinito di AllowUnboundBiff è False
Le forme supportate sono una foglia assoluta REF3D o RANGE3D e un letterale stringa, con esattamente un token coerente quando un flusso è trattenuto; espressioni, riferimenti relativi o con offset, array, dati array esterni, token sconosciuti, foglie principali e trattenute non corrispondenti e owner con binding estraneo restituiscono fslkUnsupported senza cambiare i valori in cache o lo stato di calcolo
| TXLSFormulaSimpleLeafKind | fslkUnsupported, fslkRange o fslkLiteral; esamina Kind prima di usare gli altri campi risultato |
| TXLSFormulaLeafOwnerState | flosNoRetainedStream segnala l'assenza di provenienza del flusso di token, flosUnboundStream segnala BIFF importato senza binding, flosSameOwner segnala una corrispondenza esatta dell'owner con binding, e flosForeignOwner rifiuta un owner con binding diverso |
| TXLSFormulaSimpleLeafInfo | Un record di valori senza stringhe contenente Kind, OwnerState, RangeType, ExternId, FirstRow, FirstCol, LastRow, LastCol, TextCharacters, StoredTextCharacters, ReadBytes, SyntaxNodes e TokenCount |
| Range coordinates and identity | Le coordinate sono a base zero; ExternId è l'ID logico a base 1 dell'albero di sintassi, non l'indice wire BIFF; il chiamante deve risolverlo attraverso il workbook bloccato e rifiutare workbook esterni, estensioni tra fogli, fogli mancanti o coordinate fuori dal range di cattura supportato |
| Source costs | TextCharacters è la lunghezza dell'output letterale in unità di codice UTF-16, o zero per un range; StoredTextCharacters somma il testo sorgente trattenuto, il testo dei token e il testo di sintassi esaminato; ReadBytes somma il costo a due byte del loro testo e le lunghezze dei byte raw trattenuti, comprese le rappresentazioni trattenute separatamente; questi contatori descrivono gli input dell'ispezione limitata, non l'uso totale dell'heap |
| Syntax and token counts | SyntaxNodes vale uno per una foglia compilata semplice, o due quando vengono verificate sia la foglia principale sia quella trattenuta; TokenCount è zero senza flusso o uno con un flusso trattenuto coerente supportato |
| TXLSFormulaTokenStream.ReadSimpleLeafInfo | Il livello inferiore prende gli stessi owner e quote, un ComparedLeaf opzionale e un ReferenceContext opzionale; verifica direttamente la sintassi privata del flusso, i token e i byte raw; ComparedLeaf aggiunge i controlli di coerenza con la foglia principale, mentre ReferenceContext mappa gli indici extern delle formule testuali serializzate senza copiare |
| TXLSCompiledFormula.ReadSimpleLiteral | Prende gli stessi argomenti, ripete i controlli della foglia e restituisce un WideString di proprietà del chiamante solo dopo che anche le quote rimanenti di byte e caratteri coprono il suo output; foglie non supportate o capacità rimanente insufficiente generano EInvalidOperation |
ExpectedOwner deve essere il calcolatore esatto collegato alla sorgente che lo consuma, e deve restare vivo e stabile per tutta l'ispezione e l'estrazione del letterale; un owner mancante genera EArgumentException, quote negative generano EArgumentOutOfRangeException, e input sorgente trattenuti oversized generano EInvalidOperation prima dei confronti di contenuto o della copia dell'output
Una foglia semplice senza flusso trattenuto non stabilisce il suo owner originale; un flusso importato senza binding non porta nemmeno identità di workbook, quindi AllowUnboundBiff=True esplicito è appropriato solo quando il chiamante ha già bloccato il calcolatore della sorgente e validerà l'identità del foglio locale prima di leggere le celle; l'ispezione di riferimenti importati attualmente accetta riferimenti BIFF8 e rifiuta la diversa rappresentazione extern di BIFF5
I campi di sintassi legacy denominati FFirstRowRel, FFirstColRel, FLastRowRel e FLastColRel sono true per coordinate assolute; l'helper verifica anche i flag relativi indipendenti dei token e la rappresentazione con offset, così i consumatori non devono inferire coordinate assolute da questi nomi storici
Albero di sintassi
CloneSyntaxTree restituisce un albero analizzato di proprietà del chiamante, composto da nodi TXLSSyntaxItem per l'ispezione strutturale: ogni nodo espone il proprio ItemType, il payload letterale (Value, IntValue, DecValue), gli Spaces iniziali, i collegamenti dell'albero (Parent, Child, ChildCount), la foglia di riferimento come TXLSRangeItem tramite Range e i dati delle costanti array (ArrayRows, ArrayCols, ArrayValueCount e le voci TXLSArraySerVal in ArrayValues). L'albero è una copia staccata, quindi attraversarlo non tocca mai le formule compilate della cartella di lavoro; i membri di mutazione (AddChild, PushChild, CopyObject, OffsetCopyReferences, AdjustForShift e TXLSRangeItem.CopyObject / AdjustForShift) esistono per i tool che riscrivono un albero clonato prima della ricompilazione
Punti di ingresso della cartella di lavoro
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 e SetFormulaTokens mantengono esplicita la proprietà e convalidano contesto, versione BIFF, supporto dei token, proprietà degli array e limiti dei riferimenti prima che una cella venga modificata
Registri delle funzioni utente
TXLSUserFunctionResolver e TXLSUserFunctionRegistry forniscono la ricerca per nome tramite RegisterHandler, UnregisterHandler, Clear, Contains, TryGetHandler e Count
Workbook.RegisterUserFunction('NETMARGIN', CalculateNetMargin);
Workbook.RegisterGlobalUserFunction('FISCALYEAR', CalculateFiscalYear);
try
Workbook.Calculate;
finally
Workbook.UnregisterUserFunction('NETMARGIN');
Workbook.UnregisterGlobalUserFunction('FISCALYEAR');
end;
IXLSWorkbook, TXLSWorkbook e TXLSXWorkbook espongono RegisterUserFunction, UnregisterUserFunction, ClearUserFunctions, RegisteredUserFunctionCount, RegisterGlobalUserFunction, UnregisterGlobalUserFunction, ClearGlobalUserFunctions e RegisteredGlobalUserFunctionCount
I punti di ingresso equivalenti a livello di unità sono XLSRegisterGlobalUserFunction, XLSUnregisterGlobalUserFunction, XLSClearGlobalUserFunctions, XLSRegisteredGlobalUserFunctionCount e XLSGlobalUserFunctionRegistered
TXLSCalculator.OnUserFunctionResolve partecipa prima del fallback dell'evento legacy e i gestori del registro vengono invocati al di fuori del blocco del registro, così un gestore può annullare la propria registrazione in modo sicuro
I nomi di funzione esterni e in stile macro pericolosi vengono bloccati prima della valutazione degli argomenti e della ricerca del gestore, a meno che AllowUnsafeFormulaCallbacks non sia abilitato esplicitamente per la cartella di lavoro o per la singola valutazione contestuale; i normali nomi di funzioni utente restano disponibili per default
Diagnostica delle formule
TXLSXFormulaIssueKind, TXLSXFormulaLocation e TXLSXFormulaIssue vengono restituiti da TXLSXWorkbook.AnalyzeFormulaIssues per funzioni mancanti, riferimenti esterni e componenti di riferimenti circolari
Ispezione dei fogli macro
TXLSSheetKind distingue foglio di lavoro, foglio macro, foglio grafico, modulo VBA e record di foglio sconosciuti tramite TXLSWorksheet.SheetKind; TXLSMacroRisk, TXLSMacroCommandInfo e TXLSMacroCommandArray descrivono i risultati tipizzati di TXLSWorksheet.ScanMacroCommands
Tipi AutoFit unificati e di ordinamento
TXLSMergedAutoFitStrategy e TXLSXMergedAutoFitStrategy scelgono la crescita per primo, ultimo o bilanciata per gli intervalli uniti, mentre TXLSSortOrientation, TXLSSortFormulaMode e TXLSSortCompareEvent controllano l'ordinamento stabile verticale o orizzontale e lo spostamento delle formule