Tokeny formuł i funkcje użytkownika
HotXLS udostępnia strumienie tokenów formuł należące do wywołującego do bezstratnej inspekcji i chronionego zapisu zwrotnego w obu silnikach skoroszytów, a także hierarchiczne rejestry funkcji użytkownika do niestandardowych obliczeń
Model tokenów
TXLSFormulaTokenClass, TXLSFormulaTokenKindi TXLSFormulaTokenSource klasyfikują każdy TXLSFormulaToken i rejestrują, czy pochodzi on z tekstu sparsowanego, klasycznych bajtów BIFF czy innego obsługiwanego źródła
| TXLSFormulaToken | Kind, Opcode, BaseOpcode, TokenClass, RawBytes, TextValue, NumberValue, IntegerValue, ArgumentCount, FunctionIndex, ExternSheetIndex, Row1, Col1, Row2, Col2, Row1Relative, Col1Relative, Row2Relative, Col2Relative, ReferenceUsesOffsets, Supported, ArrayRows, ArrayColsi ArrayValueCount, and ArrayValues |
| TXLSFormulaTokenStream | DecodeBiff, Clone, CloneSyntaxTree, BindContext, CanCompileFor, CanWriteBiffAt, ReplaceReference, Count, Items, Source, FormulaText, FullyDecoded, Rgce, RgbExtra, BiffWritablei BiffVersion |
| TXLSCompiledFormula | CreateTokenStream zwraca należący do wywołującego klon strumienia tokenów skompilowanej formuły |
| TXLSFormula | ArrayFormulaMode, FormulaLocale, MaxRow, MaxCol, FuncNamebyPtg, FuncArgsCntByPtg, GetCompiled, GetCompiledPreservingUnknownNames, GetCompiledR1C1, GetTokenStream, GetTranslated, GetStoreData, GetStoreDataExt, CanStoreData, BindUserDefinedFunctions, GetTExpData, SetMode, IsKnownFunction, GetFunctionNamesi FunctionArgumentClass |
Każdy silnik skoroszytów kompiluje i tłumaczy formuły przez jedną współdzieloną instancję TXLSFormula: GetCompiled parsuje tekst w stylu A1 na drzewo składni, GetCompiledR1C1 rozwiązuje odwołania R1C1 względem współrzędnych komórki, w której mieszka formuła, GetTranslated odbudowuje drzewo z klasycznych bajtów BIFF, a rodzina GetStoreData zapisuje bajty tokenów z powrotem do przechowania. MaxRow i MaxCol ograniczają siatkę odwołań akceptowaną przez kompilator — silnik XLSX podnosi je z domyślnych wartości BIFF8 do siatki XLSX, a odwołania, które nie mieszczą się w BIFF8, nie mają postaci ptg, więc pisarze BIFF8 zgłaszają je jako niekodowalne
ArrayFormulaMode jest ustawiane, gdy zapisywana jest rgce rekordu ARRAY (formuła tablicowa): odwołania klasy wartości i stałe tablicowe serializują się wtedy jako klasa tablicowa (tAreaA / tArrayA), tak jak zapisuje je sam Excel. Z operandami klasy wartości Excel oblicza formułę tablicową z niejawnym przecięciem zamiast traktować ją jako prawdziwą formułę tablicową — dlatego silniki podnoszą tę flagę dla własnej rgce rekordu ARRAY
Ograniczona inspekcja prostego zapisanego liścia
TXLSCompiledFormula.ReadSimpleLeafInfo(ExpectedOwner, MaxBytes, MaxTextCharacters, AllowUnboundBiff) bada główne drzewo składniowe i ewentualny zachowany strumień tokenów na miejscu, bez klonowania, dekompilowania, wyliczania i materializowania tokenów albo tablic; domyślnie AllowUnboundBiff ma False
Obsługiwane postacie to jeden bezwzględny liść REF3D albo RANGE3D oraz jeden literał tekstowy, przy dokładnie jednym spójnym tokenie, gdy strumień jest zachowany; wyrażenia, odwołania względne albo z przesunięciami, tablice, zewnętrzne dane tablicowe, nieznane tokeny, niedopasowane liście główny i zachowany oraz obce powiązane właściciele zwracają fslkUnsupported bez zmieniania zapamiętanych wartości ani stanu obliczeń
| TXLSFormulaSimpleLeafKind | fslkUnsupported, fslkRange albo fslkLiteral; zbadaj Kind przed użyciem pozostałych pól wyniku |
| TXLSFormulaLeafOwnerState | flosNoRetainedStream zgłasza brak proweniencji strumienia tokenów, flosUnboundStream zgłasza zaimportowany niepowiązany BIFF, flosSameOwner zgłasza dokładne dopasowanie powiązanego właściciela, a flosForeignOwner odrzuca innego powiązanego właściciela |
| TXLSFormulaSimpleLeafInfo | Rekord wartości wolny od ciągów, zawierający Kind, OwnerState, RangeType, ExternId, FirstRow, FirstCol, LastRow, LastCol, TextCharacters, StoredTextCharacters, ReadBytes, SyntaxNodesi TokenCount |
| Range coordinates and identity | Współrzędne są zero-bazowe; ExternId to logiczny, jedno-bazowy identyfikator drzewa składniowego, a nie indeks wire BIFF; wywołujący musi go rozwiązać przez przypięty skoroszyt i odrzucić skoroszyty zewnętrzne, rozpiętości arkuszy, brakujące arkusze albo współrzędne poza obsługiwanym zakresem przechwytywania |
| Source costs | TextCharacters to długość wyjścia literału w jednostkach kodowych UTF-16 albo zero dla zakresu; StoredTextCharacters sumuje zachowany tekst źródłowy, tekst tokenów i badany tekst składni; ReadBytes sumuje ich dwubajtowy koszt tekstu i zachowane surowe długości bajtowe, włącznie z osobno zachowanymi reprezentacjami; te liczniki opisują ograniczone wejścia inspekcji, a nie całkowite użycie sterty |
| Syntax and token counts | SyntaxNodes to jeden dla zwykłego skompilowanego liścia albo dwa, gdy sprawdzane są liście główny i zachowany; TokenCount to zero bez strumienia albo jeden przy obsługiwanym spójnym zachowanym strumieniu |
| TXLSFormulaTokenStream.ReadSimpleLeafInfo | Warstwa niższa przyjmuje tego samego właściciela i kwoty, opcjonalny ComparedLeaf oraz opcjonalny ReferenceContext; sprawdza bezpośrednio własną prywatną składnię strumienia, tokeny i surowe bajty; ComparedLeaf dodaje kontrole spójności liścia głównego, a ReferenceContext mapuje zserializowane indeksy extern tekstowych formuł bez kopiowania |
| TXLSCompiledFormula.ReadSimpleLiteral | Przyjmuje te same argumenty, powtarza kontrole liścia i zwraca należący do wywołującego WideString dopiero, gdy pozostałe kwoty bajtów i znaków pokrywają też jego wyjście; liście nieobsługiwane albo niewystarczająca pozostała pojemność rzucają EInvalidOperation |
ExpectedOwner musi być dokładnym kalkulatorem przypiętym do konsumowanego źródła i musi pozostać żywy oraz stabilny przez całą inspekcję i ekstrakcję literału; brakujący właściciel rzuca EArgumentException, ujemne kwoty rzucają EArgumentOutOfRangeException, a zbyt duże zachowane wejścia źródłowe rzucają EInvalidOperation przed porównaniami zawartości albo kopiowaniem wyjścia
Zwykły liść bez zachowanego strumienia nie ustala swojego oryginalnego właściciela; niepowiązany zaimportowany strumień także nie niesie tożsamości skoroszytu, więc jawne AllowUnboundBiff=True jest odpowiednie wyłącznie wtedy, gdy wywołujący już przypiął kalkulator źródłowy i zwaliduje lokalną tożsamość arkusza przed odczytem komórek; zaimportowana inspekcja odwołań przyjmuje obecnie odwołania BIFF8 i odrzuca odmienną reprezentację extern BIFF5
Starsze pola składni nazwane FFirstRowRel, FFirstColRel, FLastRowReli FLastColRel mają wartość true dla współrzędnych bezwzględnych; pomocnik sprawdza też niezależne flagi względności tokenów i reprezentację przesunięć, więc konsumenci nie muszą wnioskować współrzędnych bezwzględnych z tych historycznych nazw
Drzewo składni
CloneSyntaxTree zwraca należące do wywołującego przeanalizowane drzewo węzłów TXLSSyntaxItem do inspekcji struktury: każdy węzeł raportuje swój ItemType, payload literalny (Value, IntValue, DecValue), wiodące Spaces, powiązania drzewa (Parent, Child, ChildCount), liść odwołania jako TXLSRangeItem przez Rangeoraz dane stałej tablicowej (ArrayRows, ArrayCols, ArrayValueCounti wpisy TXLSArraySerVal w ArrayValues). Drzewo jest odłączoną kopią, więc jego przechodzenie nigdy nie dotyka skompilowanych formuł skoroszytu, a elementy mutujące (AddChild, PushChild, CopyObject, OffsetCopyReferences, AdjustForShiftoraz TXLSRangeItem.CopyObject / AdjustForShift) istnieją dla narzędzi, które przepisują sklonowane drzewo przed ponowną kompilacją
Punkty wejścia skoroszytu
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, FormulaTokensToTexti SetFormulaTokens utrzymują jawną własność oraz walidują kontekst, wersję BIFF, obsługę tokenów, własność tablic i granice odwołań przed zmianą komórki
Rejestry funkcji użytkownika
TXLSUserFunctionResolver i TXLSUserFunctionRegistry zapewniają wyszukiwanie po nazwie przez RegisterHandler, UnregisterHandler, Clear, Contains, TryGetHandleri Count
Workbook.RegisterUserFunction('NETMARGIN', CalculateNetMargin);
Workbook.RegisterGlobalUserFunction('FISCALYEAR', CalculateFiscalYear);
try
Workbook.Calculate;
finally
Workbook.UnregisterUserFunction('NETMARGIN');
Workbook.UnregisterGlobalUserFunction('FISCALYEAR');
end;IXLSWorkbook, TXLSWorkbooki TXLSXWorkbook udostępniają RegisterUserFunction, UnregisterUserFunction, ClearUserFunctions, RegisteredUserFunctionCount, RegisterGlobalUserFunction, UnregisterGlobalUserFunction, ClearGlobalUserFunctionsi RegisteredGlobalUserFunctionCount
Równoważne punkty wejścia na poziomie jednostki to XLSRegisterGlobalUserFunction, XLSUnregisterGlobalUserFunction, XLSClearGlobalUserFunctions, XLSRegisteredGlobalUserFunctionCounti XLSGlobalUserFunctionRegistered
TXLSCalculator.OnUserFunctionResolve uczestniczy przed starszym fallbackiem zdarzeń, a procedury obsługi rejestru są wywoływane poza blokadą rejestru, dzięki czemu procedura obsługi może bezpiecznie wyrejestrować samą siebie
Niebezpieczne nazwy funkcji zewnętrznych i w stylu makro są blokowane przed ewaluacją argumentów i wyszukiwaniem procedur obsługi, chyba że AllowUnsafeFormulaCallbacks zostanie jawnie włączone dla skoroszytu lub pojedynczej ewaluacji kontekstowej; zwykłe nazwy funkcji użytkownika pozostają domyślnie dostępne
Diagnostyka formuł
TXLSXFormulaIssueKind, TXLSXFormulaLocationi TXLSXFormulaIssue są zwracane przez TXLSXWorkbook.AnalyzeFormulaIssues dla brakujących funkcji, odwołań zewnętrznych i składników zależności cyklicznych
Inspekcja arkuszy makr
TXLSSheetKind rozróżnia rekordy arkusza roboczego, arkusza makr, arkusza wykresu, modułu VBA i nieznanego arkusza przez TXLSWorksheet.SheetKind; TXLSMacroRisk, TXLSMacroCommandInfoi TXLSMacroCommandArray opisują wpisane wyniki z TXLSWorksheet.ScanMacroCommands
Scalone strategie AutoFit i typy sortowania
TXLSMergedAutoFitStrategy i TXLSXMergedAutoFitStrategy wybierają pierwszy, ostatni lub zrównoważony wzrost dla scalonych zakresów, natomiast TXLSSortOrientation, TXLSSortFormulaModei TXLSSortCompareEvent sterują pionowym lub poziomym sortowaniem stabilnym oraz przenoszeniem formuł