Dokumentacija HotXLS

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 Resolve vrne xlswrsConflict
  • Add zavrne trke po natančnem ključu, po vzdevku in po podvojenem delovnem zvezku; različne polne poti in različne pripone lahko sobivajo
  • Remove in Clear preklič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
  • OnLoadWorkbook je neobvezen, nadzorovan zahtevek po viru; njegova privzeta vrednost je nil, 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
  • MaxLoadDepth je privzeto 16, MaxWorkbookCount pa 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
  • FindDependentsOfCell in izgradnja robov grafa uporabljata intervalna drevesa vrstic z obrezovanjem po največjem koncu; LastRangeCandidateChecks in EdgeCandidateChecks razkrijeta š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!
  • TXLSWorkspaceRecalcResult razkrije, 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 Recalculate na istem delovnem prostoru so serializirani, zato dve izračunski seji nikoli ne spreminjata skupnega grafa ali predpomnilnikov delovnega zvezka sočasno
  • Remove ali Clear se lahko izvede med dejavnim prehodom; prehod obdrži varne posnetke adapterjev in vrne xlswrcWorkspaceChanged namesto 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