Dokumentacija HotXLS

Reference na spoljne radne sveske

Pregled

Tablični modeli često crpe podatke iz sekundarnih radnih sveski pomoću formula unakrsnih referenci; HotXLS podržava raščlanjivanje, zapisivanje i očuvanje referenci na spoljne radne sveske i u dokumentima BIFF8 (klasični XLS) i OpenXML (XLSX)

Radni prostor živih radnih sveski

TXLSWorkbookWorkspace u lxWorkbookWorkspace je zajedničko jezgro za identifikaciju i registraciju živih spoljnih radnih sveski; i TXLSWorkbook i TXLSXWorkbook izlažu CreateWorkspaceWorkbook i poseduju ExternalWorkspace koji koriste njihovi evaluator formula, dok radna sveska ODS otvorena kroz TXLSXWorkbook kroz isti adapter prijavljuje vrstu mehanizma OpenDocument

var
  Host, Target: TXLSXWorkbook;
begin
  Host.ExternalWorkspace.Add(
    '..\Data\Target.xlsx',
    '..\Data\Target.xlsx',
    'C:\Models\Host.xlsx',
    Target.CreateWorkspaceWorkbook);

  // The compatibility facade maps an unambiguous name to the
  // relationship target already stored in Host.ExternalLinks
  Host.RegisterExternalWorkbook('Target.xlsx', Target);

  // The matching call revokes a facade-level registration
  Host.UnregisterExternalWorkbook('Target.xlsx');
end;

Klasične radne sveske koriste iste metode kompatibilnosti sa ciljevima tipa TXLSWorkbook; RegisterExternalWorkbook i UnregisterExternalWorkbook upravljaju samo mapiranjem imena na nivou fasade, dok ExternalWorkspace.Remove i Clear povlače same registracije radnog prostora. Pozivaoci koji mešaju mehanizme dodaju bilo koji adapter za Classic, XLSX ili ODS neposredno u ExternalWorkspace

  • Normalizacija identiteta je leksička i ne pravi razliku između velikih i malih slova, čuva putanje i ekstenzije, razrešuje relativne ciljeve prema izvornom identitetu vlasnika, uklanja segmente „.” i „..” i ne obavlja nikakav pristup datotečnom sistemu ili mreži
  • Tačni identiteti i eksplicitni aliasi razrešavaju se prvi; pretraga samo po osnovnom imenu uspeva jedino kada se podudara tačno jedna povezana registracija, inače Resolve vraća xlswrsConflict
  • Add odbija sudare po tačnom ključu, po aliasu i po dupliranu radnu svesku; različite pune putanje i različite ekstenzije mogu koegzistirati
  • Remove i Clear povlače registracije, dok direktno uništavanje Classic ili XLSX cilja prekida vezu njegovog adaptera i sačekava aktivne čitaoce pre oslobađanja modela
  • Spoljni radni listovi razrešavaju se po deklarisanom imenu pre fallback-a na poziciju sa indeksima od 1, pa redosled listova ciljne radne sveske ne mora da se poklapa sa imenikom izvornih veza
  • Evaluator formula najpre čita razrešenu živu radnu svesku, a zatim se vraća na tipizirani keš datoteke domaćina; Classic XLS domaćini dekodiraju razređene vrednosti XCT i CRN, dok XLSX domaćini koriste keš spoljnih veza koji paketni model već drži
  • OnLoadWorkbook je neobavezan kontrolisan zahtev za resurs; njegova podrazumevana vrednost je nil, tako da ponovno izračunavanje i dalje ne pristupa datotečnom sistemu ni mreži osim ako kod aplikacije eksplicitno ne obezbedi takvu politiku
  • Svaki normalizovani identitet poziva loader najviše jednom do ResetLoadAttempts; istovremeni zahtevi najvišeg nivoa dele rezultat koji je još u toku, uključujući tipizirane ishode „nije pronađeno” i greške, umesto da isti resurs otvaraju više puta
  • MaxLoadDepth podrazumevano iznosi 16, a MaxWorkbookCount 64; ponovni ulaz sa istim identitetom, ugnježdene zavisnosti od identiteta koji je već u toku, iscrpljivanje dubine i iscrpljivanje broja radnih sveski vraćaju tipiziranu dijagnostiku bez blokiranja u ciklusu učitavanja
  • IRI spoljnih izvora u ODF-u ostaju potpuni leksički identiteti, uključujući URI šeme i znake pod znakovima navodnika, ali nikada ne ovlašćuju implicitni pristup datoteci ili mreži
  • Sudar identiteta ostaje #REF! da zastareli keširani podaci ne bi sakrili dvosmisleno usmeravanje; odsutna keširana ćelija jeste prazna vrednost samo kada datoteka deklariše ispravan keš za taj radni list

Resolve izvršava pretragu po registracijama, a zatim opcionalno kontrolisano učitavanje; njegov ishod je TXLSWorkspaceResolveStatus (xlswrsResolved, xlswrsNotFound, xlswrsConflict, xlswrsDisconnected, xlswrsLoadNotFound, xlswrsLoadLimit, xlswrsLoadLoop ili xlswrsLoadError), a ResolveWithLoader dodatno vraća TXLSWorkspaceLoadDiagnostic koji uparuje TXLSWorkspaceLoadDiagnosticCode sa TXLSWorkspaceLoadResponseStatus (xlswlrsNotFound, xlswlrsResolved, xlswlrsError) kako bi razlikovao ishode: nije pronađeno, greška loadera, prekinuta veza, dostignuto ograničenje dubine ili broja radnih sveski, ponovni ulaz sa istim identitetom, istovremena zavisnost i sudar registracija. Povratni poziv loadera prima TXLSWorkspaceLoadRequest (identitet, dubina, broj registracija, ograničenja) i odgovara sa TXLSWorkspaceLoadResponse

Recalculate izveštava TXLSWorkspaceRecalcStatus, opciono sa raščlambom u TXLSWorkspaceRecalcResult, a evaluator beleži poreklo po ćeliji kao TXLSWorkspaceRuntimeLookup (xlswrlInactive, xlswrlResolved, xlswrlFallbackCache ili xlswrlError) tako dijagnostika može da razlikuje čitanje iz žive radne sveske od fallback-a na keš

Adapter IXLSWorkspaceWorkbook izlaže EngineKind (tip TXLSWorkspaceEngineKind: xlsweClassic, xlsweOpenXml ili xlsweOpenDocument), SourceIdentity, InstanceIdentity i Generation, proverava živost pomoću IsConnected, čita jednu ćeliju kroz TryGetCellValue (vraća tipizirani TXLSWorkspaceCellStatus: vrednost, nedostaje, neispravna referenca, prekinuta veza ili greška, uz zastavicu izlaska van korišćenog opsega), osvežava model pomoću Recalculate i otkačinje se od modela radne sveske pomoću Disconnect

Registar dodaje AddAlias za dodatna imena vezana za jedan registrovani identitet, TryResolve kao varijantu pretrage bez izuzetaka i BaseNameMatchCount za uvid u to koliko povezanih registracija deli isto osnovno ime pre izbora jednosmislenog cilja

Graf zavisnosti između radnih sveski

BuildDependencyGraph snima svaki registrovani adapter radne sveske i izvlači čvorove formula iz Classic XLS, XLSX i ODS modela u jedan TXLSWorkspaceDepGraph; metoda vraća False i bez delimičnog grafa kada bilo koji registrovani adapter ne može da obezbedi metapodatke zavisnosti

  • Svaki čvor formule čuva svoj kanonski identitet radne sveske, ime radnog lista i poziciju lista sa indeksima od 1, poziciju ćelije sa indeksima od 0, pravougaonik izlaza niza, volatilnost i stanje nerazrešenih referenci
  • Reference ćelija i pravougaonih opsega čuvaju kanonske identitete ciljne radne sveske i radnog lista; reference na cele kolone, cele redove i ceo list ostaju jedan interval umesto da se šire u milione ćelija
  • Lokalna definisana imena ostaju upitiva kao simboličke zavisnosti i isto tako se šire u svoje konkretne zavisnosti po ćelijama ili opsezima kada se definicija može statički razrešiti
  • Spoljna definisana imena čuvaju slot spoljne veze, deklarisano ime, opcionu vezanost za radni list i kanonski identitet cilja, a DDE, OLE i metapodatke korisničkih funkcija ne tretiraju kao imena radnih sveski
  • FindDependentsOfCell i izgradnja grana grafa koriste stabla rednih intervala sa odsecanjem po maksimalnom kraju; LastRangeCandidateChecks i EdgeCandidateChecks izlažu broj tačnih provera pravougaonika radi provere performansi
  • Izvlačenje formula odvija se pod zakupima za čitanje radne sveske i skenira samo materijalizovane objekte formula, tako da zapakovano skladište vrednosti ostaje zapakovano, a stvaranje grafa ne menja generacije radne sveske

Zakazano ponovno izračunavanje

Recalculate zadržava zajednički graf i gradi ga iznova samo kada se promeni registracija radnog prostora ili generacija zavisnosti formula neke radne sveske; generacije vrednosti pokreću novi neažuran prolaz, a neažurnost se širi kroz grane zavisnosti između radnih sveski

var
  RecalcInfo: TXLSWorkspaceRecalcResult;
  Status: TXLSWorkspaceRecalcStatus;
begin
  Status := Workspace.Recalculate(RecalcInfo);
  if Status <> xlswrcOk then
    HandleWorkspaceCalculation(Status, RecalcInfo);
end;
  • Jako povezane komponente računaju se po ćelijama formula, pa radne sveske mogu da se povezuju u oba smera a da ostanu aciklične dok se njihove putanje zavisnosti na nivou ćelija ne zatvaraju u petlju
  • Pravi članovi ciklusa i neažurni potomci blokirani ciklusom poništavaju se i isključuju iz topološkog redosleda, čime se sprečava da zastarele keširane vrednosti budu prikazane kao uspešni rezultati
  • Volatile ili statički nerazrešene reference primoravaju konzervativno neažurno ponašanje neophodno za ispravnost, dok stabilni grafovi ponovo koriste raniji rad na zavisnostima
  • Spoljna čitanja u okviru prolaza koriste tačan keš po instanci radne sveske, radnom listu, redu i koloni; zakazana formula poništava svoj izlazni opseg pre izračunavanja da bi kasnije zavisne vrednosti videle novu vrednost
  • Keš lokalan za prolaz nikada ne dobija autoritet nad resursima; registrovane radne sveske i opciono loader pod kontrolom pozivaoca ostaju jedini živi izvori razrešavanja, a za njima slede tipizirani keševi datoteka i #REF!
  • TXLSWorkspaceRecalcResult izlaže da li je graf ponovo izgrađen, uz brojače neažurnih, izračunatih, poništenih, ćelija u ciklusu, blokiranih, keš pogodaka i keš promašaja
  • Status razlikuje uspeh, nepodržane adaptere, radne sveske sa prekinutom vezom, kružne reference, greške izračunavanja i mutaciju radnog prostora tokom prolaza
  • Pozivi Recalculate nad istim radnim prostorom serijalizuju se, tako da dve sesije izračunavanja nikada istovremeno ne menjaju zajednički graf niti keševe radnih sveski
  • Remove ili Clear mogu da se izvrše dok je prolaz aktivan; prolaz zadržava bezbedne snimke adaptera i vraća xlswrcWorkspaceChanged umesto da dereferencira povučenu registraciju
  • Uništavanje radnog prostora sačekava da se njegov aktivni prolaz završi, dok uništavanje registrovane radne sveske prekida vezu njenog adaptera i čini da kasnije razrešavanje bezbedno propadne
  • Greške loadera i rezultati „nije pronađeno” ostaju keširani jednom po normalizovanom identitetu do ResetLoadAttempts, a neuspelo izračunavanje zadržava lokalno neažurno stanje za eksplicitan ponovni pokušaj
  • Zadržani graf čini nepromenjeni sledeći prolaz proporcionalnim broju registrovanih radnih sveski umesto broju formula; nerekurzivna analiza komponenti i kompaktne grane opsega drže duboke i široke modele ograničene materijalizovanim metapodacima formula

Odvajanje spoljnih definisanih imena

ConvertExternalDefinedNamesToRefErrors obezbeđuje istu javnu operaciju na TXLSWorkbook i TXLSXWorkbook; vraća broj definicija vezanih za radnu svesku ili radni list zamenjenih izvornim #REF!

var
  Converted: Integer;
begin
  Converted := Workbook.ConvertExternalDefinedNamesToRefErrors;
  // External-link parts and ordinary cell formulas remain intact
end;
  • Izbor u Classic XLS koristi kompajlirane BIFF tokene referenci i XTI identitet podržavajuće radne sveske, pa trodimenzionalne reference unutar iste radne sveske i nesigurni tokovi tokena ostaju nepromenjeni
  • Izbor u XLSX-u koristi numeričke slotove radnih sveski svestne sintakse u redosledu relacija dokumenta i prihvata samo delove spoljnih veza radne sveske, isključujući DDE, OLE, nerazrešene slotove, reference tabela i tekst u uglastim zagradama unutar stringova
  • Sve zamene pripremaju se pre prve mutacije i primenjuju kao jedna operacija upisa; drugi poziv je idempotentan
  • Tekst imena, vezanost za radnu svesku ili radni list, vidljivost, komentari, zastavice makroa i ugrađenosti, nepoznati XLSX atributi i imenik spoljnih veza ostaju dostupni nakon konverzije i Roundtrip-a
  • Neispravne i nepodržane definicije ostaju, gde je to moguće, očuvane bajt-po-bajt ili kao tekst i dodaju dijagnostiku xlsDiagnosticDefinedNameConversionSkipped umesto da se pogađaju
  • Zavisne formule pri ponovnom izračunavanju daju odgovarajuću Excel grešku, dok ispravan keširan rezultat obične neposredne spoljne formule ostaje dostupan ako se njena živa radna sveska kasnije prekine vezu
  • Operacija je specifična za Excel i ne tumači ponovo semantiku formula imena u OpenDocument-u

Spoljne reference klasičnog XLS-a

U klasičnim radnim sveskama XLS spoljne veze se čuvaju u bloku globalnog imenika pomoću zapisa EXTERNALBOOK i EXTERNNAME; HotXLS održava te imenike tokom ciklusa čitanja i zapisa datoteka, osiguravajući da reference udaljenih opsega prežive petlje izmena

Spoljni odnosi XLSX-a

Za radne sveske OOXML mapiranje spoljnih veza se upravlja preko delova odnosa; pogledajte detalje interfejsa za podršku u nastavku