Formül belirteçleri ve kullanıcı işlevleri
HotXLS, her iki çalışma kitabı motorunda kayıpsız inceleme ve korumalı geri yazma için çağıranın sahipliğindeki formül belirteci akışlarını ve özel hesaplama için hiyerarşik kullanıcı işlevi kayıtlarını açığa çıkarır
Belirteç modeli
TXLSFormulaTokenClass, TXLSFormulaTokenKind ve TXLSFormulaTokenSource, her TXLSFormulaToken öğesini sınıflandırır ve ayrıştırılmış metinden, klasik BIFF baytlarından veya desteklenen başka bir kaynaktan gelip gelmediğini kaydeder
| 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 ve ArrayValues |
| TXLSFormulaTokenStream | DecodeBiff, Clone, CloneSyntaxTree, BindContext, CanCompileFor, CanWriteBiffAt, ReplaceReference, Count, Items, Source, FormulaText, FullyDecoded, Rgce, RgbExtra, BiffWritable ve BiffVersion |
| TXLSCompiledFormula | CreateTokenStream, derlenmiş formül belirteci akışının çağıranın sahipliğinde bir kopyasını döndürür |
| TXLSFormula | ArrayFormulaMode, FormulaLocale, MaxRow, MaxCol, FuncNamebyPtg, FuncArgsCntByPtg, GetCompiled, GetCompiledPreservingUnknownNames, GetCompiledR1C1, GetTokenStream, GetTranslated, GetStoreData, GetStoreDataExt, CanStoreData, BindUserDefinedFunctions, GetTExpData, SetMode, IsKnownFunction, GetFunctionNames ve FunctionArgumentClass |
Her çalışma kitabı motoru, formülleri tek bir paylaşılan TXLSFormula örneği üzerinden derler ve çevirir: GetCompiled A1 tarzı metni bir sözdizimi ağacına ayrıştırır, GetCompiledR1C1 R1C1 başvularını formülün yaşadığı hücrenin koordinatlarına göre çözer, GetTranslated ağacı klasik BIFF baytlarından yeniden kurar ve GetStoreData ailesi belirteç baytlarını saklanmak üzere geri yazar. MaxRow ve MaxCol, derleyicinin kabul ettiği başvuru ızgarasını sınırlar — XLSX motoru bunları BIFF8 varsayılanlarından XLSX ızgarasına yükseltir ve BIFF8'e sığmayan başvuların ptg karşılığı olmadığından BIFF8 yazıcıları bunları kodlanamaz olarak bildirir
ArrayFormulaMode, bir ARRAY kaydının (dizi formülü) rgce'si yazılırken ayarlanır: değer sınıfı başvular ve dizi sabitleri bu durumda Excel'in kendisinin yazdığı gibi dizi sınıfı olarak (tAreaA / tArrayA) serileştirilir. Değer sınıfı işlenenlerle Excel, dizi formülünü gerçek bir dizi formülü saymak yerine örtük kesişimle değerlendirir; motorlar bu bayrağı ARRAY kaydının kendi rgce'si için bu yüzden kaldırır
Basit saklanan yaprağın sınırlı incelemesi
TXLSCompiledFormula.ReadSimpleLeafInfo(ExpectedOwner, MaxBytes, MaxTextCharacters, AllowUnboundBiff) ana sözdizimi ağacını ve tutulan belirteç akışını yerinde inceler; klonlamadan, derlemeden, değerlendirmeden veya belirteçleri ile dizileri somutlaştırmadan; varsayılan AllowUnboundBiff False'tur
Desteklenen şekiller bir mutlak REF3D veya RANGE3D yaprağı ile bir dize literalidir ve bir akış tutuluyorsa tam olarak tutarlı tek bir belirteç vardır; ifadeler, göreli veya ofset başvuruları, diziler, harici dizi verisi, bilinmeyen belirteçler, uyuşmayan ana ve tutulan yapraklar ve yabancı bağlı sahipler fslkUnsupported döndürür ve önbellek değerlerini veya hesaplama durumunu değiştirmez
| TXLSFormulaSimpleLeafKind | fslkUnsupported, fslkRange veya fslkLiteral; diğer sonuç alanlarını kullanmadan önce Kind'i inceleyin |
| TXLSFormulaLeafOwnerState | flosNoRetainedStream belirteç-akışı kökeni olmadığını bildirir, flosUnboundStream içe aktarılmış bağlı-olmayan BIFF bildirir, flosSameOwner tam bağlı sahip eşleşmesi bildirir ve flosForeignOwner farklı bir bağlı sahibi reddeder |
| TXLSFormulaSimpleLeafInfo | Kind, OwnerState, RangeType, ExternId, FirstRow, FirstCol, LastRow, LastCol, TextCharacters, StoredTextCharacters, ReadBytes, SyntaxNodes ve TokenCount içeren dizesiz bir değer kaydı |
| Range coordinates and identity | Koordinatlar 0 tabanlıdır; ExternId BIFF wire indeksi değil mantıksal 1 tabanlı sözdizimi ağacı kimliğidir; caller onu sabitlenmiş çalışma kitabı üzerinden çözmelidir ve harici kitapları, sayfa span'lerini, eksik sayfaları veya desteklenen yakalama aralığı dışındaki koordinatları reddetmelidir |
| Source costs | TextCharacters, UTF-16 kod ünitelerinde literal çıktı uzunluğudur veya bir aralık için sıfırdır; StoredTextCharacters tutulan kaynak metnini, belirteç metnini ve incelenen sözdizimi metnini toplar; ReadBytes bunların iki baytlık metin maliyetini ve tutulan ham bayt uzunluklarını — ayrı tutulan gösterimler dahil — toplar; bu sayaçlar toplam heap kullanımını değil sınırlı inceleme girdilerini tanımlar |
| Syntax and token counts | SyntaxNodes, düz derlenmiş yaprak için bir veya ana ve tutulan yaprakların ikisi de denetlendiğinde ikidir; TokenCount, akış yokken sıfır veya desteklenen tutarlı tutulan akışla birdir |
| TXLSFormulaTokenStream.ReadSimpleLeafInfo | Alt katman aynı sahip ve kotaları, isteğe bağlı ComparedLeaf ve isteğe bağlı ReferenceContext alır; akışın kendi özel sözdizimini, belirteçlerini ve ham baytlarını doğrudan denetler; ComparedLeaf ana-yaprak tutarlılık denetimleri eklerken ReferenceContext, serileştirilmiş metin-formül extern indekslerini kopyalamadan eşler |
| TXLSCompiledFormula.ReadSimpleLiteral | Aynı argümanları alır, yaprak denetimlerini yineler ve caller sahipliğinde bir WideString döndürür; yalnızca kalan bayt ve karakter kotaları da çıktısını kapsıyorsa; desteklenmeyen yapraklar veya yetersiz kalan kapasite EInvalidOperation fırlatır |
ExpectedOwner, tüketen kaynağa bağlı tam hesaplayıcı olmalı ve inceleme ile literal çıkarımı boyunca canlı ve stabil kalmalıdır; eksik sahip EArgumentException, negatif kotalar EArgumentOutOfRangeException ve aşırı büyük tutulan kaynak girişleri, içerik karşılaştırmalarından veya çıktı kopyalamadan önce EInvalidOperation fırlatır
Tutulan akışı olmayan düz bir yaprak özgün sahibini kuramaz; bağlı olmayan içe aktarılmış bir akış da çalışma kitabı kimliği taşımaz, bu nedenle açık AllowUnboundBiff=True yalnızca caller kaynak hesaplayıcıyı zaten sabitlemişse ve hücreleri okumadan önce yerel sayfa kimliğini doğrulayacaksa uygundur; içe aktarılan başvuru incelemesi şu anda BIFF8 başvurularını kabul eder ve farklı BIFF5 extern gösterimini reddeder
FFirstRowRel, FFirstColRel, FLastRowRel ve FLastColRel adlı eski sözdizimi alanları mutlak koordinatlar için doğrudur; yardımcı ayrıca bağımsız belirteç göreli bayraklarını ve ofset gösterimini denetler, böylece tüketiciler mutlak koordinatları bu tarihsel adlardan çıkarsamak zorunda kalmaz
Sözdizimi ağacı
CloneSyntaxTree, yapısal inceleme amacıyla TXLSSyntaxItem düğümlerinden oluşan, çağıranın sahipliğinde ayrıştırılmış bir ağaç döndürür: her düğüm kendi ItemType değerini, literal yükünü (Value, IntValue, DecValue), baştaki Spaces bilgisini, ağaç bağlantılarını (Parent, Child, ChildCount), Range üzerinden TXLSRangeItem türündeki başvuru yaprağını ve dizi sabiti verilerini (ArrayRows, ArrayCols, ArrayValueCount ve ArrayValues içindeki TXLSArraySerVal girdileri) raporlar. Ağaç bağımsız bir kopyadır; dolayısıyla üzerinde gezinmek, çalışma kitabının derlenmiş formüllerine hiç dokunmaz. Mutasyon üyeleri (AddChild, PushChild, CopyObject, OffsetCopyReferences, AdjustForShift ve TXLSRangeItem.CopyObject / AdjustForShift), yeniden derlemeden önce klonlanmış ağacı yeniden yazacak araçlar için mevcuttur
Çalışma kitabı giriş noktaları
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 ve SetFormulaTokens, sahipliği açık tutar ve bir hücre değiştirilmeden önce bağlamı, BIFF sürümünü, belirteç desteğini, dizi sahipliğini ve başvuru sınırlarını doğrular
Kullanıcı işlevi kayıtları
TXLSUserFunctionResolver ve TXLSUserFunctionRegistry, RegisterHandler, UnregisterHandler, Clear, Contains, TryGetHandler ve Count aracılığıyla ada göre arama sağlar
Workbook.RegisterUserFunction('NETMARGIN', CalculateNetMargin);
Workbook.RegisterGlobalUserFunction('FISCALYEAR', CalculateFiscalYear);
try
Workbook.Calculate;
finally
Workbook.UnregisterUserFunction('NETMARGIN');
Workbook.UnregisterGlobalUserFunction('FISCALYEAR');
end;
IXLSWorkbook, TXLSWorkbook ve TXLSXWorkbook, RegisterUserFunction, UnregisterUserFunction, ClearUserFunctions, RegisteredUserFunctionCount, RegisterGlobalUserFunction, UnregisterGlobalUserFunction, ClearGlobalUserFunctions ve RegisteredGlobalUserFunctionCount öğelerini açığa çıkarır
Karşılık gelen birim düzeyindeki giriş noktaları XLSRegisterGlobalUserFunction, XLSUnregisterGlobalUserFunction, XLSClearGlobalUserFunctions, XLSRegisteredGlobalUserFunctionCount ve XLSGlobalUserFunctionRegistered öğeleridir
TXLSCalculator.OnUserFunctionResolve, eski olay geri dönüşünden önce katılır ve kayıt işleyicileri kayıt kilidinin dışında çağrılır; böylece bir işleyici kendini güvenle kayıttan kaldırabilir
Tehlikeli dış ve makro tarzı işlev adları, AllowUnsafeFormulaCallbacks çalışma kitabı için ya da tekil bağlamsal değerlendirme için açıkça etkinleştirilmedikçe, bağımsız değişken değerlendirmesi ve işleyici aramasından önce engellenir; sıradan kullanıcı işlevi adları varsayılan olarak kullanılabilir kalır
Formül tanılaması
TXLSXFormulaIssueKind, TXLSXFormulaLocation ve TXLSXFormulaIssue, eksik işlevler, dış başvurular ve döngüsel bağımlılık bileşenleri için TXLSXWorkbook.AnalyzeFormulaIssues tarafından döndürülür
Makro sayfası incelemesi
TXLSSheetKind, TXLSWorksheet.SheetKind aracılığıyla çalışma sayfası, makro sayfası, grafik sayfası, VBA modülü ve bilinmeyen sayfa kayıtlarını ayırt eder; TXLSMacroRisk, TXLSMacroCommandInfo ve TXLSMacroCommandArray, TXLSWorksheet.ScanMacroCommands öğesinin türlenmiş sonuçlarını açıklar
Birleştirilmiş Otomatik Sığdır ve sıralama türleri
TXLSMergedAutoFitStrategy ve TXLSXMergedAutoFitStrategy, birleştirilmiş aralıklar için ilk, son veya dengeli büyümeyi seçerken TXLSSortOrientation, TXLSSortFormulaMode ve TXLSSortCompareEvent dikey veya yatay kararlı sıralamayı ve formül hareketini denetler