Dokumentacja HotXLS

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

TXLSFormulaTokenKind, 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
TXLSFormulaTokenStreamDecodeBiff, Clone, CloneSyntaxTree, BindContext, CanCompileFor, CanWriteBiffAt, ReplaceReference, Count, Items, Source, FormulaText, FullyDecoded, Rgce, RgbExtra, BiffWritablei BiffVersion
TXLSCompiledFormulaCreateTokenStream zwraca należący do wywołującego klon strumienia tokenów skompilowanej formuły
TXLSFormulaArrayFormulaMode, 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ń

TXLSFormulaSimpleLeafKindfslkUnsupported, fslkRange albo fslkLiteral; zbadaj Kind przed użyciem pozostałych pól wyniku
TXLSFormulaLeafOwnerStateflosNoRetainedStream 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
TXLSFormulaSimpleLeafInfoRekord 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 identityWspół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 costsTextCharacters 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 countsSyntaxNodes 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.ReadSimpleLeafInfoWarstwa 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.ReadSimpleLiteralPrzyjmuje 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ł

Zobacz także