Formelmarkörer och användarfunktioner
HotXLS exponerar anropsägda formelmarkörströmmar för förlustfri inspektion och skyddad återskrivning i båda arbetsboksmotorerna, plus hierarkiska register för användarfunktioner för anpassad beräkning
Tokenmodell
TXLSFormulaTokenClass, TXLSFormulaTokenKind och TXLSFormulaTokenSource klassificerar varje TXLSFormulaToken och registrerar om det kom från tolkad text, klassiska BIFF-bytes eller en annan stödd källa
| 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 och ArrayValues |
| TXLSFormulaTokenStream | DecodeBiff, Clone, CloneSyntaxTree, BindContext, CanCompileFor, CanWriteBiffAt, ReplaceReference, Count, Items, Source, FormulaText, FullyDecoded, Rgce, RgbExtra, BiffWritable och BiffVersion |
| TXLSCompiledFormula | CreateTokenStream returnerar en anropsägd klon av den kompilerade formelmarkörströmmen |
| TXLSFormula | ArrayFormulaMode, FormulaLocale, MaxRow, MaxCol, FuncNamebyPtg, FuncArgsCntByPtg, GetCompiled, GetCompiledPreservingUnknownNames, GetCompiledR1C1, GetTokenStream, GetTranslated, GetStoreData, GetStoreDataExt, CanStoreData, BindUserDefinedFunctions, GetTExpData, SetMode, IsKnownFunction, GetFunctionNames och FunctionArgumentClass |
Varje arbetsboksmotor kompilerar och översätter formler genom en gemensam TXLSFormula-instans: GetCompiled tolkar A1-stilad text till ett syntaxträd, GetCompiledR1C1 löser R1C1-referenser mot koordinaterna för cellen som formeln bor i, GetTranslated bygger upp ett träd igen från klassiska BIFF-byte, och GetStoreData-familjen skriver tokenbytena ut igen för lagring. MaxRow och MaxCol avgränsar referensrutnätet som kompilatorn accepterar — XLSX-motorn höjer dem från BIFF8-standarderna till XLSX-rutnätet, och referenser som inte ryms i BIFF8 saknar ptg-form, så BIFF8-skrivarna rapporterar dem som inte kodbara
ArrayFormulaMode sätts medan rgce för en ARRAY-post (en matrisformel) skrivs: referenser av värdeklass och matriskonstanter serialiseras då som matrisklass (tAreaA / tArrayA), precis som Excel själv skriver dem. Med operand av värdeklass utvärderar Excel matrisformeln med implicit skärning i stället för att behandla den som en äkta matrisformel, vilket är därför motorerna sätter flaggan för ARRAY-postens egen rgce
Avgränsad inspektion av ett enkelt lagrat blad
TXLSCompiledFormula.ReadSimpleLeafInfo(ExpectedOwner, MaxBytes, MaxTextCharacters, AllowUnboundBiff) granskar huvudsyntaxträdet och eventuell kvarhållen tokenström på plats, utan att klona, dekompilera, utvärdera eller materialisera tokens eller matriser; standardvärdet för AllowUnboundBiff är False
De stödda formerna är ett absolut REF3D - eller RANGE3D -blad och en strängliteral, med exakt en sammanhängande token när en ström är kvarhållen; uttryck, relativa eller förskjutna referenser, matriser, externa matrisdata, okända tokens, överensstämmande huvud- och kvarhållna blad som inte matchar samt främmande bundna ägare returnerar fslkUnsupported utan att ändra cachade värden eller beräkningstillståndet
| TXLSFormulaSimpleLeafKind | fslkUnsupported, fslkRange eller fslkLiteral; granska Kind innan de andra resultatfälten används |
| TXLSFormulaLeafOwnerState | flosNoRetainedStream rapporterar ingen tokenströmsproveniens, flosUnboundStream rapporterar importerad obundet BIFF, flosSameOwner rapporterar en exakt bunden ägarmatchning, och flosForeignOwner avvisar en annan bunden ägare |
| TXLSFormulaSimpleLeafInfo | En strängfri värdpost som innehåller Kind, OwnerState, RangeType, ExternId, FirstRow, FirstCol, LastRow, LastCol, TextCharacters, StoredTextCharacters, ReadBytes, SyntaxNodesoch TokenCount |
| Range coordinates and identity | Koordinaterna är nollbaserade; ExternId är det logiska ettbaserade syntaxträd-ID:t, inte BIFF-wire-indexet; anroparen måste lösa upp det genom den fastnålade arbetsboken och avvisa externa böcker, bladspann, saknade blad eller koordinater utanför dess stödda fångstområde |
| Source costs | TextCharacters är literalutmatningens längd i UTF-16-kodenheter, eller noll för ett område; StoredTextCharacters summerar kvarhållen källtext, tokentext och granskad syntaxtext; ReadBytes summerar deras tvåbytes-textkostnad och kvarhållna råa bytelängder, inklusive separat kvarhållna representationer; dessa räknare beskriver de avgränsade inspektionsindata snarare än total heap-användning |
| Syntax and token counts | SyntaxNodes är ett för ett enkelt kompilerat blad eller två när både huvud- och kvarhållna blad kontrolleras; TokenCount är noll utan ström eller ett med en stödd sammanhängande kvarhållen ström |
| TXLSFormulaTokenStream.ReadSimpleLeafInfo | Det undre lagret tar samma ägare och kvoter, valfri ComparedLeaf samt valfri ReferenceContext; det kontrollerar strömmens egen privata syntax, token och råa byte direkt; ComparedLeaf lägger till överensstämmelsekontroller av huvudbladet, medan ReferenceContext mappar serialiserade textformels externindex utan kopiering |
| TXLSCompiledFormula.ReadSimpleLiteral | Tar samma argument, upprepar bladkontrollerna och returnerar en anroparägd WideString först när de återstående byte- och teckenkvoterna också täcker dess utdata; ostödda blad eller otillräcklig återstående kapacitet utlöser EInvalidOperation |
ExpectedOwner måste vara exakt den kalkylator som sitter på den konsumerande källan, och den måste förbliva vid liv och stabil under hela inspektionen och literalextraktionen; en saknad ägare utlöser EArgumentException, negativa kvoter utlöser EArgumentOutOfRangeException, och överskridna kvarhållna källindata utlöser EInvalidOperation före innehållsjämförelser eller utdatakopiering
Ett enkelt blad utan kvarhållen ström fastställer inte sin ursprungliga ägare; en obundet importerad ström bär inte heller någon arbetsboksidentitet, så explicit AllowUnboundBiff=True är lämpligt bara när anroparen redan har fastnålat källkalkylatorn och kommer att validera den lokala bladidentiteten innan celler läses; inspektion av importerade referenser accepterar för närvarande BIFF8-referenser och avvisar den annorlunda BIFF5-externrepresentationen
De äldre syntaxfälten med namnen FFirstRowRel, FFirstColRel, FLastRowReloch FLastColRel är true för absoluta koordinater; hjälparen kontrollerar också tokens oberoende relativa flaggor och förskjutningsrepresentationen, så konsumenter behöver inte sluta sig till absoluta koordinater från dessa historiska namn
Syntaxträd
CloneSyntaxTree returnerar ett anropägt tolkat träd av TXLSSyntaxItem-noder för strukturell granskning: varje nod redovisar sin ItemType, sitt literalvärde (Value, IntValue, DecValue), inledande Spaces, trädlänkarna (Parent, Child, ChildCount), referenslövets TXLSRangeItem via Range och arraykonstantdata (ArrayRows, ArrayCols, ArrayValueCount samt TXLSArraySerVal-posterna i ArrayValues). Trädet är en fristående kopia, så en genomgång rör aldrig arbetsbokens kompilerade formler, och mutate-medlemmarna (AddChild, PushChild, CopyObject, OffsetCopyReferences, AdjustForShift samt TXLSRangeItem.CopyObject / AdjustForShift) finns för verktyg som skriver om ett klonat träd före omkompilering
Startpunkter i arbetsboken
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 och SetFormulaTokens håller ägarskapet explicit och validerar kontext, BIFF-version, tokenstöd, arrayägarskap och referensgränser innan en cell ändras
Register för användarfunktioner
TXLSUserFunctionResolver och TXLSUserFunctionRegistry tillhandahåller uppslagning efter namn genom RegisterHandler, UnregisterHandler, Clear, Contains, TryGetHandler och Count
Workbook.RegisterUserFunction('NETMARGIN', CalculateNetMargin);
Workbook.RegisterGlobalUserFunction('FISCALYEAR', CalculateFiscalYear);
try
Workbook.Calculate;
finally
Workbook.UnregisterUserFunction('NETMARGIN');
Workbook.UnregisterGlobalUserFunction('FISCALYEAR');
end;
IXLSWorkbook, TXLSWorkbook och TXLSXWorkbook exponerar RegisterUserFunction, UnregisterUserFunction, ClearUserFunctions, RegisteredUserFunctionCount, RegisterGlobalUserFunction, UnregisterGlobalUserFunction, ClearGlobalUserFunctions och RegisteredGlobalUserFunctionCount
Motsvarande enhetsnivå-startpunkter är XLSRegisterGlobalUserFunction, XLSUnregisterGlobalUserFunction, XLSClearGlobalUserFunctions, XLSRegisteredGlobalUserFunctionCount och XLSGlobalUserFunctionRegistered
TXLSCalculator.OnUserFunctionResolve deltar före det äldre händelsefallbacket, och registerhanterare anropas utanför registerlåset så att en hanterare säkert kan avregistrera sig själv
Farliga externa och makroliknande funktionsnamn blockeras innan argumenten utvärderas och innan hanteraruppslag sker, om inte AllowUnsafeFormulaCallbacks uttryckligen har aktiverats för arbetsboken eller för den enskilda kontextuella utvärderingen; vanliga användarfunktionsnamn är tillgängliga som standard
Formeldiagnostik
TXLSXFormulaIssueKind, TXLSXFormulaLocation och TXLSXFormulaIssue returneras av TXLSXWorkbook.AnalyzeFormulaIssues för saknade funktioner, externa referenser och komponenter i cirkulära beroenden
Inspektion av makroblad
TXLSSheetKind skiljer mellan arbetsblad, makroblad, diagramblad, VBA-modul och okända bladposter genom TXLSWorksheet.SheetKind; TXLSMacroRisk, TXLSMacroCommandInfo och TXLSMacroCommandArray beskriver de typsatta resultaten från TXLSWorksheet.ScanMacroCommands
Typer för sammanslagen autopassning och sortering
TXLSMergedAutoFitStrategy och TXLSXMergedAutoFitStrategy väljer första, sista eller balanserad tillväxt för sammanslagna spann, medan TXLSSortOrientation, TXLSSortFormulaMode och TXLSSortCompareEvent styr vertikal eller horisontell stabil sortering och formelförflyttning