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
ResolvevraćaxlswrsConflict Addodbija sudare po tačnom ključu, po aliasu i po dupliranu radnu svesku; različite pune putanje i različite ekstenzije mogu koegzistiratiRemoveiClearpovlač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
OnLoadWorkbookje neobavezan kontrolisan zahtev za resurs; njegova podrazumevana vrednost jenil, 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 MaxLoadDepthpodrazumevano iznosi 16, aMaxWorkbookCount64; 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
FindDependentsOfCelli izgradnja grana grafa koriste stabla rednih intervala sa odsecanjem po maksimalnom kraju;LastRangeCandidateChecksiEdgeCandidateChecksizlaž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! TXLSWorkspaceRecalcResultizlaž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
Recalculatenad istim radnim prostorom serijalizuju se, tako da dve sesije izračunavanja nikada istovremeno ne menjaju zajednički graf niti keševe radnih sveski RemoveiliClearmogu da se izvrše dok je prolaz aktivan; prolaz zadržava bezbedne snimke adaptera i vraćaxlswrcWorkspaceChangedumesto 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
xlsDiagnosticDefinedNameConversionSkippedumesto 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
- Klasa TXLSXExternalLinks — API za ispis i ažuriranje spoljnih referenci tabelarnog lista
- Interfejs IXLSWorkbook — Svojstva radne sveske najvišeg nivoa
- Svojstvo IXLSRange.Formula — Čitanje i zapisivanje formula između radnih sveski