Sklici na zunanje delovne zvezke
Pregled
Preglednični modeli pogosto črpajo podatke iz sekundarnih delovnih zvezkov s formulami navzkrižnih sklicev; HotXLS podpira razčlenjevanje, zapisovanje in ohranjanje sklicev na zunanje delovne zvezke v dokumentih BIFF8 (klasični XLS) in OpenXML (XLSX)
Delovni prostor živih delovnih zvezkov
TXLSWorkbookWorkspace v lxWorkbookWorkspace je skupno jedro za identiteto in registracijo živih zunanjih delovnih zvezkov; tako TXLSWorkbook kot TXLSXWorkbook razkrivata CreateWorkspaceWorkbook in lastita ExternalWorkspace, ki jo uporabljata njuna ocenjevalca formul, delovni zvezek ODS, odprt prek TXLSXWorkbook, pa poroča vrsto mehanizma OpenDocument prek istega adapterja
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čni delovni zvezki uporabljajo iste metode združljivosti s cilji TXLSWorkbook; RegisterExternalWorkbook in UnregisterExternalWorkbook upravljata samo preslikavo imen na ravni fasade, ExternalWorkspace.Remove in Clear pa prekličeta same registracije delovnega prostora. Klicatelji prek različnih mehanizmov dodajajo adapterje Classic, XLSX ali ODS neposredno v ExternalWorkspace
- Normalizacija identitete je leksikalna in neobčutljiva na velikost črk, ohranja poti in pripone, relativne cilje razreši glede na identiteto izvora lastnika, strne segmente s piko in ne izvede nobenega dostopa do datotečnega sistema ali omrežja
- Natančna identiteta in izrecna vzdevka se razrešita najprej; iskanje samo po osnovnem imenu uspe, kadar se ujema natanko ena povezana registracija, sicer
ResolvevrnexlswrsConflict Addzavrne trke po natančnem ključu, po vzdevku in po podvojenem delovnem zvezku; različne polne poti in različne pripone lahko sobivajoRemoveinClearprekličeta registraciji, neposredno uničenje klasičnega ali XLSX cilja pa odklopi njegov adapter in počaka na dejavne bralce, preden se model sprosti- Zunanji delovni listi se razrešijo najprej po deklariranem imenu in šele nato po pozicijskem Fallbacku z enaštetjem, zato vrstnemu redu listov ciljnega delovnega zvezka ni treba ustrezati imeniku povezav vira
- Ocenjevalnik formul najprej bere razrešeni živi delovni zvezek in šele nato prek Fallbacka uporabi tipizirani predpomnilnik gostiteljske datoteke; gostitelji Classic XLS dekodirajo redke vrednosti XCT in CRN, gostitelji XLSX pa uporabijo predpomnilnik zunanjih povezav, ki ga že nosi model paketa
OnLoadWorkbookje neobvezen, nadzorovan zahtevek po viru; njegova privzeta vrednost jenil, zato ponovni izračun tudi nadalje ne izvede nobenega dostopa do datotečnega sistema ali omrežja, če te politike aplikacijska koda izrecno ne zagotovi- Vsaka normalizirana identiteta prikliče nalagalnik največ enkrat do
ResetLoadAttempts; sočasni vrhnji zahtevki si delijo rezultat v teku, vključno s tipiziranimi izidi »ni najdeno« in napakami, namesto da bi isti vir odpirali večkrat MaxLoadDepthje privzeto 16,MaxWorkbookCountpa 64; ponovni vstop po isti identiteti, gnezdena odvisnost od identitete, ki je že v teku, izčrpana globina in izčrpano število delovnih zvezkov vrnejo tipizirano diagnostiko, ne da bi se izračunski ciklus blokiral- IRI zunanjih virov ODF ostanejo popolne leksikalne identitete, vključno s shemami URI in znaki v navedkih, nikoli pa ne odobrijo posrednega dostopa do datotek ali omrežja
- Identitetni spor ostane
#REF!, tako da zastareli predpomnjeni podatki ne morejo skriti dvoumnega usmerjanja; odsotna predpomnjena celica je prazna vrednost samo, kadar datoteka za ta list deklarira veljaven predpomnilnik
Resolve izvede registrirano iskanje in nato neobvezen nadzorovani nalagalni klic; njegov izid je TXLSWorkspaceResolveStatus (xlswrsResolved, xlswrsNotFound, xlswrsConflict, xlswrsDisconnected, xlswrsLoadNotFound, xlswrsLoadLimit, xlswrsLoadLoop ali xlswrsLoadError), ResolveWithLoader pa vrne še TXLSWorkspaceLoadDiagnostic, ki par TXLSWorkspaceLoadDiagnosticCode z TXLSWorkspaceLoadResponseStatus (xlswlrsNotFound, xlswlrsResolved, xlswlrsError) in razloči izide ni-najdeno, napaka nalagalnika, odklopljeni rezultat, omejitev globine ali števila delovnih zvezkov, ponovni vstop po identiteti, sočasna odvisnost in spor pri registraciji. Povratni klic nalagalnika prejme TXLSWorkspaceLoadRequest (identiteta, globina, število registriranih, omejitve) in odgovori z TXLSWorkspaceLoadResponse
Recalculate poroča TXLSWorkspaceRecalcStatus, neobvezno z razčlenitvijo TXLSWorkspaceRecalcResult, ocenjevalnik pa za vsako celico zabeleži izvor branja kot TXLSWorkspaceRuntimeLookup (xlswrlInactive, xlswrlResolved, xlswrlFallbackCache ali xlswrlError), tako da diagnostika loči branje živega zvezka od predpomnjenega Fallbacka
Adapter IXLSWorkspaceWorkbook razkrije EngineKind (tip TXLSWorkspaceEngineKind: xlsweClassic, xlsweOpenXml ali xlsweOpenDocument), SourceIdentity, InstanceIdentity in Generation, preveri živost s IsConnected, prebere eno celico prek TryGetCellValue (vrne tipizirani TXLSWorkspaceCellStatus: vrednost, manjkajoča celica, neveljaven sklic, odklopljeno ali napaka, plus zastavica izven uporabljenega obsega), osveži model s Recalculate in z Disconnect odklopi model delovnega zvezka
Register doda AddAlias za dodatna imena, vezana na eno registrirano identiteto, TryResolve kot različico iskanja brez izjem in BaseNameMatchCount za predogled, koliko povezanih registracij si deli osnovno ime, preden izberete nedvoumni cilj
Graf odvisnosti med delovnimi zvezki
BuildDependencyGraph posneme vsak registrirani adapter delovnega zvezka in iz modelov Classic XLS, XLSX in ODS izlušči vozlišča formul v en sam TXLSWorkspaceDepGraph; metoda vrne False in brez delnega grafa, kadar kateri koli registrirani adapter ne more zagotoviti metapodatkov odvisnosti
- Vozlišče vsake formule ohrani kanonično identiteto delovnega zvezka, ime delovnega lista in njegov položaj z enaštetjem, položaj celice z ničštetjem, izhodni pravokotnik polja, spremenljivost in stanje nerazrešenih sklicev
- Sklici na celice in pravokotne obsege ohranijo kanonični identiteti ciljnega delovnega zvezka in delovnega lista; sklici na cel stolpec, celo vrstico ali cel list ostanejo en interval in se ne razširijo v milijone celic
- Lokalni definirani sklici ostanejo poizvedljivi kot simbolne odvisnosti in se, kadar je definicijo mogoče statično razrešiti, razširijo tudi v svoje konkretne odvisnosti po celicah ali obsegih
- Zunanji definirani sklici ohranijo režo zunanje povezave, deklarirano ime, neobvezni obseg delovnega lista in kanonično identiteto cilja, ne da bi metapodatke DDE, OLE ali uporabniških funkcij obravnavali kot imena delovnih zvezkov
FindDependentsOfCellin izgradnja robov grafa uporabljata intervalna drevesa vrstic z obrezovanjem po največjem koncu;LastRangeCandidateChecksinEdgeCandidateChecksrazkrijeta število natančnih preverjanj pravokotnikov za preverjanje učinkovitosti- Izluščevanje formul poteka pod najemi branja delovnega zvezka in pregleda samo materializirane objekte formul, zato ostane zapakirana shramba vrednosti zapakirana in ustvarjanje grafa ne spremeni generacij delovnega zvezka
Načrtovani ponovni izračun
Recalculate obdrži skupni graf in ga znova zgradi samo, ko se spremeni registracija delovnega prostora ali generacija odvisnosti formul delovnega zvezka; generacije vrednosti zasejejo nov prehod po umazanih vozliščih, umazanost pa se širi prek robov odvisnosti med delovnimi zvezki
var
RecalcInfo: TXLSWorkspaceRecalcResult;
Status: TXLSWorkspaceRecalcStatus;
begin
Status := Workspace.Recalculate(RecalcInfo);
if Status <> xlswrcOk then
HandleWorkspaceCalculation(Status, RecalcInfo);
end;
- Močno povezane komponente se računajo na celicah s formulami, zato si lahko delovni zvezki povezujejo v obe smeri in ostanejo aciklični, dokler njihove poti odvisnosti na ravni celic ne tvorijo zanke
- Pravi člani ciklov in umazani potomci, blokirani s ciklom, se razveljavijo in izključijo iz topološkega vrstnega reda, tako da zastarele predpomnjene vrednosti ne morejo prevzeti vloge uspešnih rezultatov
- Spremenljivi ali statično nerazrešljivi sklici vsilijo konservativno obnašanje umazanosti, ki ga zahteva pravilnost, stabilni grafi pa ponovno uporabijo prejšnje delo odvisnosti
- Zunanja branja znotraj prehoda uporabljajo natančni predpomnilnik po instanci delovnega zvezka, delovnem listu, vrstici in stolpcu; načrtovana formula razveljavi svoj izhodni obseg pred vrednotenjem, tako da poznejši odvisni opazujejo novo vrednost
- Predpomnilnik, vezan na prehod, nikoli ne podeli pooblastila nad viri; edina živa izvora razreševanja ostajata registrirana delovna zvezka in neobvezen nalagalnik pod nadzorom klicatelja, sledita pa tipizirana predpomnilnika datotek in
#REF! TXLSWorkspaceRecalcResultrazkrije, ali je bil graf znova zgrajen, ter števce umazanih, ovrednotenih, razveljavih, ciklov, blokiranih, zadetkov v predpomnilnik in promaškov- Status razloči uspeh, nepodprte adapterje, odklopljene delovne zvezke, krožne sklice, napake izračuna in spremembo delovnega prostora med prehodom
- Klici
Recalculatena istem delovnem prostoru so serializirani, zato dve izračunski seji nikoli ne spreminjata skupnega grafa ali predpomnilnikov delovnega zvezka sočasno RemovealiClearse lahko izvede med dejavnim prehodom; prehod obdrži varne posnetke adapterjev in vrnexlswrcWorkspaceChangednamesto da bi sledil odstranjeni registraciji- Uničenje delovnega prostora počaka, da se njegov dejaven prehod zaključi, uničenje registriranega delovnega zvezka pa odklopi njegov adapter in povzroči, da poznejše razreševanje varno odpove
- Neuspehi in izidi »ni najdeno« pri nalagalniku ostanejo predpomnjeni enkrat na normalizirano identiteto do
ResetLoadAttempts, neuspel izračun pa ohrani lokalno stanje umazanosti za izrecen poskus znova - Ohranjeni graf naredi nespremenjen ponovni prehod sorazmeren številu registriranih delovnih zvezkov in ne številu formul; nerekurzivna analiza komponent in kompaktni robovi obsegov ohranijo globoke in široke modele znotraj mej materializiranih metapodatkov formul
Odpenjanje zunanjih definiranih sklicev
ConvertExternalDefinedNamesToRefErrors ponuja isto javno operacijo na TXLSWorkbook in TXLSXWorkbook; vrne število definicij na ravni delovnega zvezka in na ravni delovnega lista, zamenjanih z izvornimi #REF!
var Converted: Integer; begin Converted := Workbook.ConvertExternalDefinedNamesToRefErrors; // External-link parts and ordinary cell formulas remain intact end;
- Izbira v Classic XLS uporablja prevedene žetone sklicev BIFF in identiteto podpornega delovnega zvezka XTI, zato tridimenzionalni sklici znotraj istega delovnega zvezka in negotovi tokovi žetonov ostanejo nespremenjeni
- Izbira v XLSX uporablja številske reže delovnih zvezkov, ozaveščene o sintaksi, v vrstnem redu dokumenta relacij, in sprejme samo dele zunanjih povezav delovnega zvezka; izključeni so DDE, OLE, nerazrešene reže, sklici na tabele in besedilo v oglatih oklepajih znotraj nizov
- Vse zamenjave se pripravijo, preden pride do prve spremembe, in se potrdijo kot ena pisalna operacija; drugi klic je idempotenten
- Besedilo imena, obseg na ravni delovnega zvezka ali delovnega lista, vidnost, komentarji, zastavici makra in vgrajenega imena, neznani atributi XLSX ter imenik zunanjih povezav ostanejo po pretvorbi na voljo in preživijo round-trip
- Okvarjene in nepodprte definicije ostanejo, kjer je to mogoče, ohranjene bajt za bajtom ali kot besedilo ter dodajo diagnostiko
xlsDiagnosticDefinedNameConversionSkipped, namesto da bi jih ugibali - Odvisne formule se ponovno izračunajo v ustrezno Excelovo vrednost napake, medtem ko veljaven predpomnjeni rezultat običajne neposredne zunanje formule ostane na voljo, če se njen živi delovni zvezek kasneje odklopi
- Operacija je specifična za Excel in ne tolmači znova semantike imen z formulami OpenDocumenta
Zunanji sklici klasičnega XLS-a
V klasičnih delovnih zvezkih XLS so zunanje povezave shranjene v bloku globalnega imenika z zapisi EXTERNALBOOK in EXTERNNAME; HotXLS vzdržuje te imenike med cikli branja in pisanja datotek, kar zagotavlja, da sklici na oddaljene obsege preživijo zanke sprememb
Zunanje relacije XLSX-a
Za delovne zvezke OOXML se preslikava zunanjih povezav upravlja prek delov relacij; oglejte si podrobnosti podpornega vmesnika spodaj
- Razred TXLSXExternalLinks — API za izpis in posodabljanje zunanjih sklicev preglednice
- Vmesnik IXLSWorkbook — Lastnosti delovnega zvezka najvišje ravni
- Lastnost IXLSRange.Formula — Branje in pisanje formul med delovnimi zvezki